PortSwigger path-traversal labs

1 Lab: File path traversal, simple case

网页使用 GET 请求获取图片。

1
<img src="/image?filename=5.jpg">

linux 系统网站的 base directory 是 /var/www/images,使用目录穿越,构造 payload ../../../etc/passwd

Lab 解决,由于 <img> 标签限制,无法展示出 /etc/passwd 文件的内容。

为了方便展示,使用 burp 抓包,发送到 Repeater,修改 filename。

得到的响应报文如下:

可以看到已经拿到了 /etc/passwd 的内容。

2 Lab: File path traversal, traversal sequences blocked with absolute path bypass

同样,使用 burp 抓包,正常的图片请求如下:

构造 filename:../../../etc/passwd

可能是网站对 filename 进行了过滤。

使用绝对路径绕过。

发送 filename=/etc/passwd

成功。


[!question] 问题
服务端没有回显对 filename 的解析结果,如何选择合适的绕过方式?

答:只能一个一个试,或者用字典爆破


3 Lab: File path traversal, traversal sequences stripped non-recursively

burp 抓包,构造 filename,....//..././..././etc/passwd 类似于双写绕过,后端的逻辑可能是仅将 ../ 替换为 空。

拿到 /etc/passwd

4 Lab: File path traversal, traversal sequences stripped with superfluous URL-decode

抓包,burp 重放,构造 filename=../../../etc/passwd

响应也不出意外的是 “No such file”。

使用双重 URL 编码绕过,构造 payload : filename=%252e%252e%252f%252e%252e%252f%252e%252e%252fetc/passwd

推荐一个编码工具,CyberChef


成功访问 /etc/passwd

5 Lab: File path traversal, validation of start of path

burp 抓包,可以看到文件以 /var/www/images/ 开头,后端可能会判断文件的前几个目录来判断其有效性。

构造文件名 filename=../../../etc/passwd

得到的响应如下:

构造文件名 filename=/var/www/images/../../../etc/passwd

成功绕过。

6 Lab: File path traversal, validation of file extension with null byte bypass

构造文件名:filename=../../../etc/passwd%00.jpg。因为这个 lab 是通过验证文件扩展名来验证其有效性,所以我们以 .jpg 结尾,但我们想要访问的文件并不含有 .jpg,这里使用空字节 %00 截断。

.jpg 绕过验证,在解析文件名时只解析 %00 前的部分。

成功拿到 /etc/passwd