该实验室在产品图像显示方面存在路径遍历漏洞。
要完成实验,请检索文件内容/etc/passwd。
一、/etc/passwd 在哪里?
Linux 系统的绝对路径就是:
/etc/passwd
它位于根目录 / 下的 etc 目录中。
Linux 目录结构大概是:
/
├── bin
├── boot
├── dev
├── etc
│ ├── passwd
│ ├── shadow
│ └── hosts
├── home
├── root
├── tmp
├── usr
└── var
所以:
/etc/passwd
就是一个固定的位置。
二、为什么目录遍历能够访问它?
假设网站代码:
include($_GET['file']);
正常访问:
http://example.com/?file=images/logo.png
实际上服务器访问的是
/var/www/html/images/logo.png
如果没有做限制,你可以利用
../
返回上一级目录。
例如:
images/logo.png
变成
../
表示:
/var/www/html/
↑
../
继续:
../../
表示:
/var/www/
↑
../
不断往上:
../../../
最后会到:
/
然后再进入
etc/passwd
于是形成
../../../../etc/passwd
三、怎么知道要几个 ../?
这就是很多人刚学目录遍历时最疑惑的地方。
例如网站根目录:
/var/www/html/
需要:
html
↑
../
www
↑
../
var
↑
../
/
所以:
../../../etc/passwd
即可。
如果程序位于
/opt/tomcat/webapps/app/images/
那就需要更多:
../../../../../etc/passwd
四、真实测试时怎么办?
通常不知道程序当前目录。
因此会逐步尝试,例如:
../etc/passwd
../../etc/passwd
../../../etc/passwd
../../../../etc/passwd
../../../../../etc/passwd
../../../../../../etc/passwd
很多 CTF 或实验环境都是这样验证目录遍历是否存在。
五、为什么多写几个 ../ 也能成功?
Linux 文件系统规定:
当已经到达根目录 / 后:
/
↑
../
仍然还是
/
例如:
../../../../../../../../etc/passwd
最终仍然会解析为:
/etc/passwd
所以在不少实验环境中,会看到故意写很多层 ../。
六、目录遍历的核心原理
假设服务器当前目录:
/var/www/html/images/
请求:
../../../etc/passwd
解析过程:
/var/www/html/images/
│
├── ..
│
/var/www/html/
│
├── ..
│
/var/www/
│
├── ..
│
/
│
└── etc/passwd
最终访问:
/etc/passwd
七、实验过程
先放行图片的访问

在图片我们可以得到完整的图片路径是
https://0afd0035031ad62f81501719005800bf.web-security-academy.net/resources/images/rating5.png
也就是说我们只需要三个../即可到达根目录访问/etc/passwd
然后再去刷新攻击页面重新拦截图片的获取的URL并重放后更改URL发送
