在本节中,将会解释什么是目录遍历,并通过靶机试验描述如何进行路径遍历攻击和规避常见的障碍。
目录遍历中常见的绕过机制
在某些情况下,例如在URL路径或multipart/form-data请求的文件名参数中,应用服务器可能会将传递文件名进行过滤,剥离所有的目录遍历序列。这个时候我们就需要通过URL编码,甚至是双URL编码来绕过这种防御机制。
单编码:../编码为%2e%2e%2f
双编码:再对%2e%2e%2f编码为%252e%252e%252f
或者是各种非标准编码,也可以解决问题,例如:
◆..%c0%af
◆..%ef%bc%8f
在BurpSuite中,Burp Intruder提供了一个预定义的有效载荷列表(Fuzzing-path traversal),其中包含各种编码的路径遍历序列。
如果应用程序要求提供的文件名必须以预期的基本文件夹开头,则可以包含所需的基本文件夹,然后是合适的遍历序列。
例如,要求以/var/www/images开头:
如果应用程序要求提供的文件名必须以预期的文件扩展名结尾,那么可以使用空字节在所需扩展名之前有效地终止文件路径。
例如,要求以.png结尾:
场景试验-利用URL编码绕过遍历序列防护:
https://portswigger.net/web-security/file-path-traversal/lab-simple
场景说明:
这个场景在图像显示中包含文件路径遍历漏洞,应用程序阻止包含路径遍历序列的输入,但在执行输入之前会对输入进行URL解码。
试验目的:
要完成这个试验,需要检索/etc/passwd文件的内容。
攻击过程:
①由于不知道防御机制到底会过滤哪些组合,因此先用Intruder自动化打一波,看看哪些能进去,发送一个图像请求到Intruder进行配置,在Positions选项卡设置攻击变量
②在Payloads选项卡中,选择字典,随后进行攻击
③从结果可以看到,服务器对%2e(表示.)和%252f(双编码表示/)没有过滤
④接下来发送个请求到Repeater,改造下Payload,因为根据前几个试验知道基本都是返回三层目录,因此直接从返回三层开始测试,攻击成功,完成试验。
%2e%2e%252f%2e%2e%252f%2e%2e%252fetc/passwd
试验小结:
在有些场景下,因为不知道服务器具体会过滤哪些组合,所以可能要通过反复尝试不同的编码来看哪些编码可以绕过服务器的防护。
场景试验-绕过路径开始验证:
https://portswigger.net/web-security/file-path-traversal/lab-validate-start-of-path
场景说明:
这个场景在图像显示中包含文件路径遍历漏洞,应用程序通过请求参数传输完整的文件路径,并验证提供的路径是否以预期的文件夹开头。
试验目的:
要完成这个试验,需要检索/etc/passwd文件的内容。
攻击过程:
①这个试验也相当简单,打开页面后抓包就能看到,在请求图片时是完整的路径,把这个请求发送到Repeater
②改造Payload,保留前面目录的路径,在其后面添加遍历序列返回上一级目录,发送后即可完成试验
/var/www/images/../../../etc/passwd
试验小结:
这种场景基本上也只存在于试验中,一般服务器很少会把自己的直接路径暴露出来,风险非常大。
场景试验-通过空字节绕过文件扩展名的验证:
https://portswigger.net/web-security/file-path-traversal/lab-validate-file-extension-null-byte-bypass
场景说明:
这个场景在图像显示中包含文件路径遍历漏洞,应用程序会验证提供的文件名是否以预期的文件扩展名结尾。
试验目的:
要完成这个试验,需要检索/etc/passwd文件的内容。
攻击过程:
①这个试验也不复杂,抓包能看到文件后缀是jpg,把这个请求发送到Repeater
②改造Payload,通过将空格URL编码成%00来中断后缀,发送后即可完成试验
../../../etc/passwd%00.jpg
试验小结:
这个场景的漏洞利用实现也比较简单,只是通过这种场景来讲解下类似绕过的思路,一般实际环境会比这些更复杂。
如何防止目录遍历攻击
防止目录遍历漏洞最有效的方式是完全避免将用户提供的输入传递给文件系统的API,可以重写许多执行此操作的功能,以更安全的方式提供相同的行为。
如果将用户提供的输入传递给文件系统API是不可避免的,则应该结合两层防御来防止攻击:
●应用程序应在处理用户输入之前对其进行验证,最理想的情况下,应该采用白名单比对方式。如果所需功能无法做到这一点,则应验证输入是否仅包含允许的内容,例如纯字母数字字符。
●对输入进行验证后,应用程序应将输入附加到基本目录并使用平台文件系统API来规范路径,应该验证路径是否以预期的基本目录开头。
下面这个是简单JAVA代码示例,用于根据用户输入验证文件的规范路径:
身份验证漏洞-多因素身份验证中的漏洞(上)
身份验证漏洞-基于密码的登录漏洞(上)
SQL注入攻击-检索隐藏的数据
HTTP高级请求走私-HTTP请求隧道(上)
HTTP高级请求走私-CRLF的利用(上)
HTTP高级请求走私-响应队列中毒
HTTP Host头漏洞-密码重置投毒
HTTP Host头漏洞攻击-概念梳理
原文始发于微信公众号(H君网安白话):目录遍历攻击(下)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论