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