皮卡丘靶场解题记录-目录遍历

1、漏洞原理总结:

服务器想象成一个图书馆,有个管理员负责拿书:

  • 正常情况:你只能说”soup 书架上的某本书”(title=jarheads.php),管理员去 soup/ 书架帮你拿。
  • 漏洞情况:管理员把你的书名原样拼进”去 soup 书架拿”的命令里,没检查。你说”../ 往上走一层”,就跳出了 soup 书架,能一路往上走到别的房间,甚至档案室,拿出任意文件。

../ 就相当于路径里的”上一级“。多写几个,就一路往上爬,爬到服务器根目录,再拐进 /etc/passwd

2、我的测试过程:

直接用目录穿越的手法就行了

image-20260823164721067

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

image-20260823165805814

3、核心漏洞代码分析:

在dir_list.php中,没有传入内容进行处理

image-20260823163916591

这关用的是 require,跟文件包含那关的 include 是亲戚——原理一模一样(用户输入拼路径 + 无过滤),只是这关的演示重点是读文件内容(目录遍历),不是执行代码(getsell)

防御方法:

用白名单固定文件名(只允许 jarheads.phptruman.php),或用 basename() 把路径里的 ../ 剥掉

4、实战延伸:

image-20260823164311985

章节答疑:

1、网站目录里一定存在的目录名有哪些?

Linux服务器:

image-20260823170654363

windows服务器:

image-20260823170721088

这些文件跟网站无关、一定存在。读到它们 = 目录遍历肯定成功,不用猜路径。

但注意:读 /etc/passwd 只是验证漏洞。SRC 里真正值钱的是应用配置文件config.php.envdb.phpdatabase.yml 等,里面往往有数据库账号密码),这些不是一定存在,但一旦读到就是高危。

2、实战的时候怎么发现这类漏洞?

分四步:找功能点、查看原效果、探针试探、响应判断

第一步,找文件/路径作为参数的功能点

image-20260823171609760

filefilenamepathdirnamesrctemplateincludepage见到这些,优先测。

第二步,摸清正常响应

先正常传一个值,看服务器返回什么(文件内容?图片?还是报错?),作为对照基线。

第三步,注入探针

需要先判断目标是什么系统,再决定探针。响应头server、报错信息、X-Powered-By等能看出技术栈。后文补充。

/etc/passwd 当目标,试各种变体(很多站会过滤 ../,要绕过)

image-20260823171836820

第四步,响应判断

  • 返回了 /etc/passwd 内容(root:x:0:0...)→ 目录遍历成立

  • 返回 403/404/空 → 可能被过滤,换变体继续试。

3、如何顺着配置拿数据库密码?

分几步:确认漏洞存在、摸技术栈、确定配置文件名和路径、读配置、拿密码放大

目录遍历读到 /etc/passwd 只是证明漏洞存在,真正目的是读应用的配置文件,拿到数据库密码,再放大利用。

需要先摸清技术栈才能确定配置文件在哪。这个不是乱猜的,需要看目标是用什么写的。

  • 响应头X-Powered-By: PHP/7.4(PHP)、ServerSet-CookieJSESSIONID=Java、PHPSESSID=PHP、session=Python)。
  • 报错信息URL 特征index.php=PHP、/xxx.action=Java、/admin 后台框架)。
  • 看是不是已知 CMS/框架(WordPress、ThinkPHP、Laravel、Discuz 等,目录结构固定)。

常见的配置文件有这些:

image-20260823172809624

确认技术栈之后又分两类,一类路径固定,一类未知

  • 已知 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);二是用文件下载的漏洞读,不会被执行。

最后,拿到密码之后如何放大成果:

image-20260823174253097

4、目录遍历 + 文件包含 + 文件下载,三个同源漏洞对比表格

这三个漏洞本质上是同一个问题:用户可控的文件路径 + 后端不过滤。区别在用什么函数处理和利用目的

image-20260823174155484