目录遍历 | PortSwigger(burpsuite官方靶场)
写在前面
官方链接:https://portswigger.net/web-security/file-path-traversal
在解释知识点时,一部分对官方解释进行了引用,另一部分对具体解题加入了自己的想法,注意甄别。那么,开始吧。
考虑一个显示待售商品图像的购物应用程序。图像通过一些 HTML 加载,如下所示:
<img src="/loadImage?filename=218.png">
loadImageURL 接受一个参数并返回指定文件 的filename内容。图像文件本身存储在磁盘中的位置/var/www/images/。要返回图像,应用程序将请求的文件名附加到此基本目录并使用文件系统 API 来读取文件的内容。在上述情况下,应用程序从以下文件路径读取:
/var/www/images/218.png
该应用程序没有针对目录遍历攻击实施任何防御措施,因此攻击者可以请求以下 URL 从服务器的文件系统中检索任意文件:
https://insecure-website.com/loadImage?filename=../../../etc/passwd
这会导致应用程序从以下文件路径读取:
/var/www/images/../../../etc/passwd
该序列…/在文件路径中有效,意味着在目录结构中上一级。三个连续的…/序列从/var/www/images/文件系统的根目录开始,所以实际读取的文件是:
/etc/passwd
在基于 Unix 的操作系统上,这是一个标准文件,其中包含在服务器上注册的用户的详细信息。
在 Windows 上,../
和..\
都是有效的目录遍历序列,检索标准操作系统文件的等效攻击是:
https://insecure-website.com/loadImage?filename=..\..\..\windows\win.ini
File path traversal, simple case
/var/www/image/3.jpg
由于是在iamge下进行请求,向上返回三级依次就能到达,www,var,/
File path traversal, traversal sequences blocked with absolute path bypass
许多将用户输入放置到文件路径中的应用程序实现了某种针对路径遍历攻击的防御,并且这些通常可以被规避。
如果应用程序从用户提供的文件名中剥离或阻止目录遍历序列,则可以使用多种技术绕过防御。
在不能够使用相对路径的情况下,也许可以使用来自文件系统根目录的绝对路径,例如filename=/etc/passwd直接引用文件,而无需使用任何遍历序列。
发现敏感api
单独请求
使用之前的相对路径已经不行了,使用绝对路径反而可以成功
File path traversal, traversal sequences stripped non-recursively
发现敏感api
直接请求
这里其实有一点强行,这里是常规绕waf中的双写绕过,替换之后就是之前第一种的相对路径请求。
File path traversal, traversal sequences stripped with superfluous URL-decode
在某些情况下,例如在 URL 路径或请求filename参数中multipart/form-data,Web 服务器可能会在将您的输入传递给应用程序之前剥离任何目录遍历序列。您有时可以通过 URL 编码,甚至双重 URL 编码,绕过这种清理,这些…/字符分别产生%2e%2e%2f或%252e%252e%252f。各种非标准编码,例如…%c0%afor …%ef%bc%8f,也可以解决问题。
探测到敏感api
直接请求
或许你已经发现了,发现可能出现目录遍历的点后,就是不停的去“试”,想办法去绕waf,其实这也是fuzz的场景之一。这也是在目录遍历的场景中使用的通用方法。
如果你使用的是burpsuite professional 可以直接照做下面的方法。
探测成功
重放成功的探测请求
更改一下请求点
File path traversal, validation of start of path
探测敏感api
直接请求
这里是正则,请求文件时必须包含关键字(/var/www/images/),绕过这个waf即可
File path traversal, validation of file extension with null byte bypass
这个场景是请求时必须包含规定的后缀(这里时 .jpg)
可以使用url编码中的空格绕过,在请求时到空格之前检测就结束,但正则能够匹配到.jpg