freeBuf
Path Traversal路径遍历内容学习笔记与靶场通关方法(附靶场地址)
2024-04-01 13:00:37

前言

什么是路径遍历?

目录遍历使攻击者能够读取运行应用程序的服务器上的任意文件。这可能包括:

  • 应用程序代源码和数据。
  • 后端系统的认证凭据。
  • 敏感的操作系统文件。

在某些情况下,攻击者能够获得对服务器上的任意文件进行读写的权限,从而允许他们修改应用程序数据或行为,并最终完全控制服务器。

通过路径遍历读取任意文件

假设有一个显示待售商品图像的购物应用程序使用以下 HTML 加载图像:

<img src="/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

靶场部分

地址:https://portswigger.net/web-security/learning-paths/server-side-vulnerabilities-apprentice/path-traversal-apprentice/file-path-traversal/lab-simple

按下F12查看页面源代码,单击左侧红框所示处。1707569899_65c772ebc8b0314ffd63f.png!small?1707569900307

将鼠标移动至任意图片并单击可见如前文所述之URL。

1707570057_65c7738984917b163a8c3.png!small?1707570058081

使用火狐插件froxyproxy配置本地代理。

1707571366_65c778a6ed27e37434d66.png!small?1707571367906

在网址输入栏输入http://burp并单击CA Certificate下载证书 。

1707571366_65c778a6c6f13b162029f.png!small?1707571367907

下载完成后到火狐设置搜索证书,单击查看证书。

1707571367_65c778a701cc8a147b8f3.png!small?1707571367907

此时单击导入,导入刚刚下载的证书。

1707571366_65c778a6e87ce9c905854.png!small?1707571367908

单击红框所示处。

1707571367_65c778a737f74336466db.png!small?1707571367909

在详情页面抓取数据包,单击forward放包直至可见参数,鼠标右击选择send to repeater写入payload。1707571624_65c779a8763ee86f7dd5b.png!small?1707571625201

1707571848_65c77a88dc2b06132b37f.png!small?1707571849679

修改完成后放出数据包,可见返回了passwd的内容。

1707571848_65c77a88f20b2152c03de.png!small?1707571849679

路径遍历的常见障碍以及相应的处理方法

屏蔽“../”的过滤

路径遍历可能会有多种防护手段,其中包括屏蔽“../”。这种屏蔽可以通过使用绝对路径来绕过。

(如filename=/etc/passwd

对应靶场

地址:https://portswigger.net/web-security/file-path-traversal/lab-absolute-path-bypass

进入靶场,burp suite开始抓包并单击网页中任意view details随意查看一个商品。1711938856_660a1d28c71f522ab2fbe.png!small

1711938382_660a1b4e576d02a4327d3.png!small

不停放包直到看见”filename=“的参数。

1711939030_660a1dd66f6f10db227c5.png!small

1711938943_660a1d7f716b3554386b4.png!small

1711939030_660a1dd65eb4de9fd986b.png!small

鼠标右击,将数据包发送到repeater。

1711939030_660a1dd65e9219d077a71.png!small

尝试之前的方法,发现返回bad request,考虑网站进行了屏蔽。

1711940785_660a24b13bf48d0a14eb8.png!small

将”filename=“直接设置成/etc/passwd查看passwd文件中的内容。

1711939083_660a1e0b260391ff7ecf5.png!small

至于为什么知道是Linux,这个可以前期信息收集的时候用nmap扫出来。

剥离相关参数的过滤(人话:后端删除你输入的“../”)

有的目录遍历过滤采用从输入值中识别并删除所有“../”的过滤方式,此时可以采用输入“....//”的方法,对于“....//”,删除“../”后“....//”会变成“../”,同样具备返回上一级目录的功能。

对应靶场

地址:https://portswigger.net/web-security/file-path-traversal/lab-sequences-stripped-non-recursively

开始抓包,并且单击view details。

1711939847_660a21079ae9136b08129.png!small

一直放包直到出现想要的参数。

1711939846_660a2106ca6218b9644a1.png!small

1711940784_660a24b072fddb57d4013.png!small

鼠标右击数据包,send to repeater。

1711940784_660a24b0584b56ded28a8.png!small

同理,单纯使用“../”是无法查看passwd内容的。

1711940784_660a24b0c066b6908cc70.png!small

修改filename处的payload,通过“....//”绕过过滤,单击send发送后成功读取passwd文件。

1711940784_660a24b085866f6855633.png!small

编码绕过

在某些环境中,例如在 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,抓包,放包直到看见相关参数。

1711941519_660a278f6a67e65a0907a.png!small

send to repeater。

1711942088_660a29c8482146ed62bfc.png!small

同理发现之前的方法都行不通,使用编码绕过成功。这些编码payload可以在GitHub上搜索path traversal可以得到一些fuzz用的字典,可以直接用。

1711942089_660a29c90b293521bf005.png!small

”%252f“是“/”的URL编码两次的结果。

1711942134_660a29f6b049c7f3ac169.png!small

1711942155_660a2a0b00e1c8adf5c75.png!small

要求预期的文件路径开头的路径遍历

应用程序可能需要用户提供的文件名以预期的基文件夹开头,例如/var/www/images。在这种情况下,可以包含所需的基文件夹,后跟合适的遍历序列。例如:filename=/var/www/images/../../../etc/passwd

对应靶场

地址:https://portswigger.net/web-security/file-path-traversal/lab-validate-start-of-path

同前面的实验一样抓包,放包直到看见相关参数。

1711942963_660a2d33ecf4a435d7b67.png!small

可以看见,filename的参数是带有绝对路径的。

1711943139_660a2de302917a0204221.png!small

所以利用漏洞时不能漏掉/var/www,要在payload的头部加入/var/www这一基层文件路径。

1711943139_660a2de327bfa179277ef.png!small

1711943139_660a2de3222af08b1cc18.png!small

需要特定结尾的网站

应用程序可能要求用户提供的文件名以预期的文件扩展名结尾,例如.png。在这种情况下,可以使用空字节(%00是编码形式,常用于截断)在所需扩展名之前有效地终止文件路径。例如:

filename=../../../etc/passwd%00.png

单击view details,抓包,放包直到看见相关参数。

1711941519_660a278f6a67e65a0907a.png!small

send to repeater。

1711942088_660a29c8482146ed62bfc.png!small

输入payload,保留文件结尾但用%00截断。

1711943808_660a30807221b9411d38e.png!small

如何防止路径遍历攻击

防止路径遍历漏洞的最有效方法是完全避免将用户提供的输入传递给文件系统 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等,具体根据操作系统以及中间件特性操作。

本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
文章目录