阻止访问 lynx 中的本地主机
Block access to localhost in lynx
我是运行一个主要由bash脚本组成的BBS。
碰巧今天刚好进入Lynx,按“/”回车。想象一下当它吐出我的根目录的内容时我的恐惧!我一直在 Windows 中这样做(在浏览器中访问本地文件),但我从来没有想过要在这里考虑。
具有讽刺意味的是,有一个 lynx 标志可以 禁用 非本地主机位置,但我在这里需要做的是相反的方法。本地机器上有敏感的数据库密码和其他受保护的信息。我听说有几台类似的机器以这种方式被典当,通过在远程机器上使用 Lynx 运行 利用此漏洞,在本例中是 BBS。
我试图通过设置一个 if-else 语句来解决这个问题。不幸的是,在 URL 中输入“/”仍然有效。
read -r -p "Web Address: " url
if [ "${url:0:4}" == "http" ] || [ "${url:0:5}" == "https" ]
then
lynx $url -accept_all_cookies
else
$url="http://$url"
lynx $url -accept_all_cookies
fi
鉴于此的性质,我想确保我们有一个防弹解决方案,因为这是一台生产机器。有什么方法可以在 100% 的时间内可靠地清理用户输入以防止访问本地文件?
访问localhost和127.0.0.1都可以;不必要,但所做的只是调出 Apache 成功安装页面。
我的想法是:
- 阻止访问任何以“/”开头的路径
这有点困难,因为当输入“/”时,Lynx 似乎将其重定向到 URL,whine,然后将其重定向到本地 URL:
Web Address: /
/home/com/file.sh: line 109: /=http:///: No such file or directory
/ directory (p1 of 2)
Current directory is /
然后它转出我的根目录列表。
- 如果前 4 个字符不是 http 或前 5 个字符不是 https,自动添加 http:// - 这仍然允许用户省略 URLs 的 http:// 部分。
但是,我意识到这还不够。用户仍然可以键入目录中本地文件的名称。我在调用此脚本的目录中输入 shell 脚本的名称,Lynx 吐出 bash 脚本的内容。
最重要的是,我在 Lynx 中有 "go to" 选项,一旦页面 已经 被加载,我不用担心!我可以像 lynx $url -goto
那样禁用它,但如果我可以避免它,我宁愿不这样做。
禁用 Web 实用程序不是一个选项,所以有没有办法再次确保它安全?
例如,如果您传递 /home
、˜/
和 file://
,Lynx 将列出您的主目录。但是如果你传递home
,Lynx会把它改写成www.home.com。所以:
- 删除前导
/
、˜/
和 file://
,如果需要(如果存在)
但让我们考虑一下,您在调用 Lynx 的同一目录中有一个名为 home
的文件;它会显示你的文件。所以:
- 如果需要(如果不存在)
前置 http(s)://
事实上,您可以通过对所有 URL 加强前缀 http:// 来解决所有问题,如 http://file:/ / 或 http://~/ 没有意义。
请看how Lynx handles various types of URL and URL_DOMAIN_PREFIXES/SUFFIXES。
经过更多测试,我得出了以下解决方案,
它并不漂亮,但它确实可以在不减少功能的情况下工作:
read -r -p "Web Address: " url
if [ "$url" == "" ]
then
lynx "https://analogfiles.ml" -accept_all_cookies -restrictions=bookmark,bookmark_exec,chdir,disk_save,dired_support,dotfiles,editor,exec,file_url,inside_ftp,lynxcfg_info,lynxcgi,mail,outside_telnet,print
elif [ "${url:0:1}" == "/" ] || [ "${url:0:1}" == "~" ] || [ "${url:0:7}" == "file://" ]
then
lynx "~http" -accept_all_cookies -restrictions=bookmark,bookmark_exec,chdir,disk_save,dired_support,dotfiles,editor,exec,file_url,inside_ftp,lynxcfg_info,lynxcgi,mail,outside_telnet,print
elif [ "${url:0:7}" == "http://" ] || [ "${url:0:8}" == "https://" ]
then
lynx $url -accept_all_cookies -restrictions=bookmark,bookmark_exec,chdir,disk_save,dired_support,dotfiles,editor,exec,file_url,inside_ftp,lynxcfg_info,lynxcgi,mail,outside_telnet,print
else
lynx "http://"$url -accept_all_cookies -restrictions=bookmark,bookmark_exec,chdir,disk_save,dired_support,dotfiles,editor,exec,file_url,inside_ftp,lynxcfg_info,lynxcgi,mail,outside_telnet,print
fi
第一部分处理主页(我已将其设置为多个 Lynx-friendly 站点之一)。由于我的限制,按 ENTER 键不再导致主页正常工作。
第二部分阻止 Lynx 甚至接收到可以被视为本地的 URL。这是因为 即使通过标志 启用了限制,Lynx 也不会 使它们对给定的 URL 生效!这意味着如果 Lynx 收到机器本地的 URL,例如 file://home/
,它将允许它,即使被标志禁用。我创建了一个名为 http
的错误消息文件,但用户只会看到一条 FTP 错误消息,这对我来说没问题。
否则,如果 URL 缺少 http:// 或 https://,我将添加 http://。
可以通过键入 lynx -restrictions
查看您在此处看到的限制,其中提供了更多信息。
您看到的最相关的限制是 dired_support
,它不允许导航到本地文件(其他限制不直接相关,但我认为没有理由允许它们,所以为了安全起见我不允许它们)。这意味着我可以继续允许使用 GoTo,而不用担心可以通过这种方式访问本地文件,绕过我在这里使用的 if-else 检查。事实上,if/else 检查只是必要的,因为 Lynx 未能正确应用从 shell 脚本访问的第一个 URL 的限制。
换句话说,我必须手动阻止使用我的 if-else 语句访问本地文件,然后相信 Lynx 会禁止访问其上的本地文件。
我是运行一个主要由bash脚本组成的BBS。
碰巧今天刚好进入Lynx,按“/”回车。想象一下当它吐出我的根目录的内容时我的恐惧!我一直在 Windows 中这样做(在浏览器中访问本地文件),但我从来没有想过要在这里考虑。
具有讽刺意味的是,有一个 lynx 标志可以 禁用 非本地主机位置,但我在这里需要做的是相反的方法。本地机器上有敏感的数据库密码和其他受保护的信息。我听说有几台类似的机器以这种方式被典当,通过在远程机器上使用 Lynx 运行 利用此漏洞,在本例中是 BBS。
我试图通过设置一个 if-else 语句来解决这个问题。不幸的是,在 URL 中输入“/”仍然有效。
read -r -p "Web Address: " url
if [ "${url:0:4}" == "http" ] || [ "${url:0:5}" == "https" ]
then
lynx $url -accept_all_cookies
else
$url="http://$url"
lynx $url -accept_all_cookies
fi
鉴于此的性质,我想确保我们有一个防弹解决方案,因为这是一台生产机器。有什么方法可以在 100% 的时间内可靠地清理用户输入以防止访问本地文件?
访问localhost和127.0.0.1都可以;不必要,但所做的只是调出 Apache 成功安装页面。
我的想法是:
- 阻止访问任何以“/”开头的路径
这有点困难,因为当输入“/”时,Lynx 似乎将其重定向到 URL,whine,然后将其重定向到本地 URL:
Web Address: /
/home/com/file.sh: line 109: /=http:///: No such file or directory
/ directory (p1 of 2)
Current directory is /
然后它转出我的根目录列表。
- 如果前 4 个字符不是 http 或前 5 个字符不是 https,自动添加 http:// - 这仍然允许用户省略 URLs 的 http:// 部分。
但是,我意识到这还不够。用户仍然可以键入目录中本地文件的名称。我在调用此脚本的目录中输入 shell 脚本的名称,Lynx 吐出 bash 脚本的内容。
最重要的是,我在 Lynx 中有 "go to" 选项,一旦页面 已经 被加载,我不用担心!我可以像 lynx $url -goto
那样禁用它,但如果我可以避免它,我宁愿不这样做。
禁用 Web 实用程序不是一个选项,所以有没有办法再次确保它安全?
例如,如果您传递 /home
、˜/
和 file://
,Lynx 将列出您的主目录。但是如果你传递home
,Lynx会把它改写成www.home.com。所以:
- 删除前导
/
、˜/
和file://
,如果需要(如果存在)
但让我们考虑一下,您在调用 Lynx 的同一目录中有一个名为 home
的文件;它会显示你的文件。所以:
- 如果需要(如果不存在) 前置
http(s)://
事实上,您可以通过对所有 URL 加强前缀 http:// 来解决所有问题,如 http://file:/ / 或 http://~/ 没有意义。
请看how Lynx handles various types of URL and URL_DOMAIN_PREFIXES/SUFFIXES。
经过更多测试,我得出了以下解决方案,
它并不漂亮,但它确实可以在不减少功能的情况下工作:
read -r -p "Web Address: " url
if [ "$url" == "" ]
then
lynx "https://analogfiles.ml" -accept_all_cookies -restrictions=bookmark,bookmark_exec,chdir,disk_save,dired_support,dotfiles,editor,exec,file_url,inside_ftp,lynxcfg_info,lynxcgi,mail,outside_telnet,print
elif [ "${url:0:1}" == "/" ] || [ "${url:0:1}" == "~" ] || [ "${url:0:7}" == "file://" ]
then
lynx "~http" -accept_all_cookies -restrictions=bookmark,bookmark_exec,chdir,disk_save,dired_support,dotfiles,editor,exec,file_url,inside_ftp,lynxcfg_info,lynxcgi,mail,outside_telnet,print
elif [ "${url:0:7}" == "http://" ] || [ "${url:0:8}" == "https://" ]
then
lynx $url -accept_all_cookies -restrictions=bookmark,bookmark_exec,chdir,disk_save,dired_support,dotfiles,editor,exec,file_url,inside_ftp,lynxcfg_info,lynxcgi,mail,outside_telnet,print
else
lynx "http://"$url -accept_all_cookies -restrictions=bookmark,bookmark_exec,chdir,disk_save,dired_support,dotfiles,editor,exec,file_url,inside_ftp,lynxcfg_info,lynxcgi,mail,outside_telnet,print
fi
第一部分处理主页(我已将其设置为多个 Lynx-friendly 站点之一)。由于我的限制,按 ENTER 键不再导致主页正常工作。
第二部分阻止 Lynx 甚至接收到可以被视为本地的 URL。这是因为 即使通过标志 启用了限制,Lynx 也不会 使它们对给定的 URL 生效!这意味着如果 Lynx 收到机器本地的 URL,例如 file://home/
,它将允许它,即使被标志禁用。我创建了一个名为 http
的错误消息文件,但用户只会看到一条 FTP 错误消息,这对我来说没问题。
否则,如果 URL 缺少 http:// 或 https://,我将添加 http://。
可以通过键入 lynx -restrictions
查看您在此处看到的限制,其中提供了更多信息。
您看到的最相关的限制是 dired_support
,它不允许导航到本地文件(其他限制不直接相关,但我认为没有理由允许它们,所以为了安全起见我不允许它们)。这意味着我可以继续允许使用 GoTo,而不用担心可以通过这种方式访问本地文件,绕过我在这里使用的 if-else 检查。事实上,if/else 检查只是必要的,因为 Lynx 未能正确应用从 shell 脚本访问的第一个 URL 的限制。
换句话说,我必须手动阻止使用我的 if-else 语句访问本地文件,然后相信 Lynx 会禁止访问其上的本地文件。