ScreenShot_2026-04-12_141118_866.png
点开连接
ScreenShot_2026-04-12_141131_913.png
发现居然是乱码
f12看看与源代码,也没有信息
试试发包,看响应?

ScreenShot_2026-04-12_141305_067.png
依旧没有提示
那可以看看是不是和前几题一样是源码泄露?
试试/.git/config
也是没有
接下来目录扫描:看看有啥入口:
得到:robots.txt
访问看到:
ScreenShot_2026-04-12_141701_849.png
继续点进去
ScreenShot_2026-04-12_141635_369.png
啥也没有
看题解,人家的目录扫描有phpmyadmin,还有robots.txt提示给的是
ScreenShot_2026-04-12_141906_135.png
所以访问phpmyadmin,
ScreenShot_2026-04-12_142031_141.png
到这里翻找了一下也没看到flag,题解说是cev历史漏洞,我没招了

最后的payload: /phpmyadmin/?target=db_datadict.php%253f/../../../../../../../../flag
ScreenShot_2026-04-12_142216_818.png
解释一下payload:

1. target (漏洞的入口)
这是 phpMyAdmin 首页 (index.php) 接收的一个 URL GET 参数。
在正常的业务中,phpMyAdmin 会通过 target 参数来决定接下来要加载(include)哪个页面模块,例如正常访问可能是 ?target=main.php。
正是因为底层代码使用了 include() 函数来直接加载这个参数指定的文件,这就为文件包含漏洞埋下了伏笔。我们要做的,就是想办法把 target 指向我们想看的文件(比如 /flag)。

2. db_datadict.php (白名单的通行证)
这是用来欺骗白名单校验的。
phpMyAdmin 的开发者知道 include 很危险,所以写了一个安全校验函数 checkPageValidity()。这个函数会检查你传入的 target 是不是在系统允许的“白名单”里。
db_datadict.php 就是这个白名单里合法存在的一个文件名。我们在 payload 的最开头写上它,是为了让防御机制看一眼:“哦,开头是合法文件”,从而放行我们的请求。

3. %253f (整个 payload 的灵魂)
这是一个双重 URL 编码(Double URL Encoding)的技巧。

%25 是字符 % 的 URL 编码。

所以 %253f 经过服务器(比如 Nginx/Apache)第一层接手并解码后,就变成了 %3f。

而 %3f 再次解码的话,就是问号 ?。
phpMyAdmin 的白名单校验函数有一个致命特性——如果它在字符串里遇到了 ?,它就会认为后面的是参数,
从而只截取 ? 前面的部分去和白名单比对。

然后又利用 include() 函数直接操作底层文件系统的特性,让操作系统把这个假 ? 当成了一个普通的目录名,
从而使得后面的 ../ 目录穿越符得以生效!