前言
什么是路径遍历?
目录遍历使攻击者能够读取运行应用程序的服务器上的任意文件。这可能包括:
- 应用程序代源码和数据。
- 后端系统的认证凭据。
- 敏感的操作系统文件。
在某些情况下,攻击者能够获得对服务器上的任意文件进行读写的权限,从而允许他们修改应用程序数据或行为,并最终完全控制服务器。
通过路径遍历读取任意文件
假设有一个显示待售商品图像的购物应用程序使用以下 HTML 加载图像:
<img src="https://www.freebuf.com/loadImage?filename=218.png">
URL中的loadImage
采用参数filename
指定返回的文件内容。一般来讲,文件会存储在磁盘的/var/www/images/
。为了返回图像,应用程序将请求的文件名附加到基目录/var/www/images/
,并使用文件系统 API 读取文件的内容。也就是说应用程序从以下文件路径读取文件:
/var/www/images/218.png
当应用程序没有实现针对路径遍历进行严格过滤时,攻击者可以请求以下 URL达成 从服务器的文件系统中检索/etc/passwd
文件:
https://insecure-website.com/loadImage?filename=../../../etc/passwd
这会导致应用程序从以下文件路径读取文件:
/var/www/images/../../../etc/passwd
../
意味着在目录结构中返回上一级目录。三个连续../
从当前位置/var/www/images/
文件系统根目录开始返回三次上级目录,因此实际读取的文件是:
/etc/passwd
在基于 Unix 的操作系统上,这是一个标准文件,其中包含在服务器上注册的用户的详细信息,但攻击者可以使用相同的技术检索其他任意文件。
在 Windows 上,两者都../
..\
是有效的目录遍历payload,这也意味着我们可以通过使用斜杠和反斜杠互相代替绕过过滤。以下是针对基于 Windows 的服务器的等效攻击示例:
https://insecure-website.com/loadImage?filename=..\..\..\windows\win.ini
靶场部分
按下F12查看页面源代码,单击左侧红框所示处。
将鼠标移动至任意图片并单击可见如前文所述之URL。
使用火狐插件froxyproxy配置本地代理。
在网址输入栏输入http://burp并单击CA Certificate下载证书 。
下载完成后到火狐设置搜索证书,单击查看证书。
此时单击导入,导入刚刚下载的证书。
单击红框所示处。
在详情页面抓取数据包,单击forward放包直至可见参数,鼠标右击选择send to repeater写入payload。
修改完成后放出数据包,可见返回了passwd的内容。
路径遍历的常见障碍以及相应的处理方法
屏蔽“../”的过滤
路径遍历可能会有多种防护手段,其中包括屏蔽“../”。这种屏蔽可以通过使用绝对路径来绕过。
(如filename=/etc/passwd
)
对应靶场
地址:https://portswigger.net/web-security/file-path-traversal/lab-absolute-path-bypass
进入靶场,burp suite开始抓包并单击网页中任意view details随意查看一个商品。
不停放包直到看见”filename=“的参数。
鼠标右击,将数据包发送到repeater。
尝试之前的方法,发现返回bad request,考虑网站进行了屏蔽。
将”filename=“直接设置成/etc/passwd查看passwd文件中的内容。
至于为什么知道是Linux,这个可以前期信息收集的时候用nmap扫出来。
剥离相关参数的过滤(人话:后端删除你输入的“../”)
有的目录遍历过滤采用从输入值中识别并删除所有“../”的过滤方式,此时可以采用输入“....//”的方法,对于“....//”,删除“../”后“....//”会变成“../”,同样具备返回上一级目录的功能。
对应靶场
地址:https://portswigger.net/web-security/file-path-traversal/lab-sequences-stripped-non-recursively
开始抓包,并且单击view details。
一直放包直到出现想要的参数。
鼠标右击数据包,send to repeater。
同理,单纯使用“../”是无法查看passwd内容的。
修改filename处的payload,通过“....//”绕过过滤,单击send发送后成功读取passwd文件。
编码绕过
在某些环境中,例如在 URL 路径或multipart/form-data
请求filename
的参数中,Web 服务器可能会在将输入传递到应用程序之前剥离任何目录遍历序列(就是无论输入“../”还是“....//”都会被清除过滤)。这时可以尝试通过 URL 编码甚至双 URL 编码来绕过../
这种清理字符。这分别产生%2e%2e%2f
和%252e%252e%252f
两种输入。各种非标准编码(如..%c0%af
或..%ef%bc%8f
)也可能有效,具体是否生效取决于服务器能不能解析编码,有没有解析相关编码的能力。Path_Travelsal_Payload_List
对应靶场
地址:https://portswigger.net/web-security/file-path-traversal/lab-superfluous-url-decode
同样,单击view details,抓包,放包直到看见相关参数。
send to repeater。
同理发现之前的方法都行不通,使用编码绕过成功。这些编码payload可以在GitHub上搜索path traversal可以得到一些fuzz用的字典,可以直接用。
”%252f“是“/”的URL编码两次的结果。
要求预期的文件路径开头的路径遍历
应用程序可能需要用户提供的文件名以预期的基文件夹开头,例如/var/www/images
。在这种情况下,可以包含所需的基文件夹,后跟合适的遍历序列。例如:filename=/var/www/images/../../../etc/passwd
对应靶场
地址:https://portswigger.net/web-security/file-path-traversal/lab-validate-start-of-path
同前面的实验一样抓包,放包直到看见相关参数。
可以看见,filename的参数是带有绝对路径的。
所以利用漏洞时不能漏掉/var/www,要在payload的头部加入/var/www这一基层文件路径。
需要特定结尾的网站
应用程序可能要求用户提供的文件名以预期的文件扩展名结尾,例如.png
。在这种情况下,可以使用空字节(%00是编码形式,常用于截断)在所需扩展名之前有效地终止文件路径。例如:
filename=../../../etc/passwd%00.png
单击view details,抓包,放包直到看见相关参数。
send to repeater。
输入payload,保留文件结尾但用%00截断。
如何防止路径遍历攻击
防止路径遍历漏洞的最有效方法是完全避免将用户提供的输入传递给文件系统 API。可以重写许多执行此操作的应用程序函数,以更安全的方式提供相同的行为。
- 在处理用户输入之前对其进行验证。理想情况下,将用户输入与允许值的白名单进行比较。如果无法做到这一点,请验证输入是否仅包含允许的内容,例如仅包含字母数字字符。
- 验证提供的输入后,将输入追加到基目录,并使用平台文件系统 API 规范化路径。验证规范化路径是否以预期的基目录开头。
Java 代码示例,用于根据用户输入验证文件的规范路径:
File file = new File(BASE_DIRECTORY, userInput);
if (file.getCanonicalPath().startsWith(BASE_DIRECTORY)) {//这里写处理文件的过程}
总结
细节方面
多注意前端代码中的图片等文件是否通过直接访问图片文件来显示图片的,如果有就可以进行路径遍历的测试。使用burp suite测试时如果只注意http history可能会错过一些测试点,有条件还是在proxy处抓包放包查看数据包。测试路径遍历也可以使用fuzz字典提升效率,而Windows上的“../”和“..\”有一样的效果,可以相互替换来尝试绕过保护(屏蔽了“../”就用“..\”,在编码绕过等情形下同理)。
漏洞方面
假如测试路径遍历漏洞,发现“../”行不通时就测试“....//”和尝试URL编码(多次)和其他编码。然后测试加入文件后缀并尝试%00截断,如果参数本身带有基文件路径就尝试加入基文件路径如/var/www等,具体根据操作系统以及中间件特性操作。
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)