皮卡丘靶场解题记录-目录遍历
皮卡丘靶场解题记录-目录遍历
1、漏洞原理总结:
服务器想象成一个图书馆,有个管理员负责拿书:
- 正常情况:你只能说”soup 书架上的某本书”(
title=jarheads.php),管理员去soup/书架帮你拿。 - 漏洞情况:管理员把你的书名原样拼进”去 soup 书架拿”的命令里,没检查。你说”
../往上走一层”,就跳出了 soup 书架,能一路往上走到别的房间,甚至档案室,拿出任意文件。
../就相当于路径里的”上一级“。多写几个,就一路往上爬,爬到服务器根目录,再拐进/etc/passwd。
2、我的测试过程:
直接用目录穿越的手法就行了

顺手让agent给我改成post请求也玩了一下

3、核心漏洞代码分析:
在dir_list.php中,没有传入内容进行处理
这关用的是 require,跟文件包含那关的 include 是亲戚——原理一模一样(用户输入拼路径 + 无过滤),只是这关的演示重点是读文件内容(目录遍历),不是执行代码(getsell)
防御方法:
用白名单固定文件名(只允许 jarheads.php、truman.php),或用 basename() 把路径里的 ../ 剥掉
4、实战延伸:
章节答疑:
1、网站目录里一定存在的目录名有哪些?
Linux服务器:
windows服务器:
这些文件跟网站无关、一定存在。读到它们 = 目录遍历肯定成功,不用猜路径。
但注意:读
/etc/passwd只是验证漏洞。SRC 里真正值钱的是应用配置文件(config.php、.env、db.php、database.yml等,里面往往有数据库账号密码),这些不是一定存在,但一旦读到就是高危。
2、实战的时候怎么发现这类漏洞?
分四步:找功能点、查看原效果、探针试探、响应判断
第一步,找文件/路径作为参数的功能点
file、filename、path、dir、name、src、template、include、page见到这些,优先测。
第二步,摸清正常响应
先正常传一个值,看服务器返回什么(文件内容?图片?还是报错?),作为对照基线。
第三步,注入探针
需要先判断目标是什么系统,再决定探针。响应头server、报错信息、X-Powered-By等能看出技术栈。后文补充。
用 /etc/passwd 当目标,试各种变体(很多站会过滤 ../,要绕过)
第四步,响应判断
返回了
/etc/passwd内容(root:x:0:0...)→ 目录遍历成立返回 403/404/空 → 可能被过滤,换变体继续试。
3、如何顺着配置拿数据库密码?
分几步:确认漏洞存在、摸技术栈、确定配置文件名和路径、读配置、拿密码放大
目录遍历读到 /etc/passwd 只是证明漏洞存在,真正目的是读应用的配置文件,拿到数据库密码,再放大利用。
需要先摸清技术栈才能确定配置文件在哪。这个不是乱猜的,需要看目标是用什么写的。
- 看响应头:
X-Powered-By: PHP/7.4(PHP)、Server、Set-Cookie(JSESSIONID=Java、PHPSESSID=PHP、session=Python)。 - 看报错信息、URL 特征(
index.php=PHP、/xxx.action=Java、/admin后台框架)。 - 看是不是已知 CMS/框架(WordPress、ThinkPHP、Laravel、Discuz 等,目录结构固定)。
常见的配置文件有这些:
确认技术栈之后又分两类,一类路径固定,一类未知
- 已知 CMS → 路径固定,直接拼(WordPress 的
wp-config.php、Discuz 的config/config_global.php)。 - 未知 → 靠报错泄露绝对路径、
/proc/self/environ拿工作目录、字典猜常见配置名。
然后看配置文件类型的时候,php类需要注意。
有一个小坑。我之前也遇到过。PHP 配置文件如果是被被会被执行,读不到源码,看到一片空白。.env、.yml、properties、json这些是直接出明文。两个解决方案,一是用伪协议把源码base64之后再读,到时候转回来(比如,php://filter,?filename=php://filter/convert.base64-encode/resource=config.php);二是用文件下载的漏洞读,不会被执行。
最后,拿到密码之后如何放大成果:
4、目录遍历 + 文件包含 + 文件下载,三个同源漏洞对比表格
这三个漏洞本质上是同一个问题:用户可控的文件路径 + 后端不过滤。区别在用什么函数处理和利用目的
