写在前面:
感觉路径穿越漏洞发现与利用比较依赖工具?手动测试过程中绕过方式基本靠猜,而且也没啥回显。由于题目有很多提示,所以总的来说完成的还算顺畅。
其实 PortSwigger 对应的 Lab 下面就有解题思路,本文仅作一个记录,如果有小伙伴有其他思路或感悟,欢迎评论区分享哦。
还没有学习路径穿越的小伙伴可以先看看这篇文章捏:路径穿越基础介绍
废话不多说,hacking for fun!
1 Lab: File path traversal, simple case
网页使用 GET 请求获取图片。
<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
成功。
问题
服务端没有回显对 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