目录
文件包含
响应头伪造
preg_replace() 函数
获取 flag
文件包含
根据题目描述“其他破坏者会利用工控云管理系统设备维护中心的后门入侵系统”,打开设备维护中心后查看 F12。

看到超链接中有 “?page” 这个 GET 方法传递的参数,考虑在这个参数使用 PHP 伪协议中的 “php://filter” 读取 index 的源码。
利用 payload 成功读取到了 index.php 的 base64 加密形式,把它转换回我们能看得懂的。
响应头伪造
观察到 index.php 被执行的条件是 “$_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1'”,也就是说这个请求必须是本地的请求,修改 HTTP 响应头 X_FORWARDED_FOR 的值为 “127.0.0.1”。
preg_replace() 函数
这段 PHP 代码会获取 3 个变量:pat、rep 和 sub 的值,然后进入一个 if-else 语句。isset() 函数在 PHP 中用来判断变量是否声明,此处如果这 3 个值都有传递就会执行 preg_replace()函数。
preg_replace 函数执行一个正则表达式的搜索和替换,语法如下:
<col>
参数
说明
$pattern
要搜索的模式,可以是字符串或一个字符串数组
$replacement
用于替换的字符串或字符串数组
$subject: 要搜索替换的目标字符串或字符串数组
$limit
可选,对于每个模式用于每个 subject 字符串的最大可替换次数。默认是 -1(无限制)
$count
可选,为替换执行的次数
如果 subject 是一个数组, preg_replace() 返回一个数组,其他情况下返回一个字符串。如果匹配被查找到,替换后的 subject 被返回,其他情况下 返回没有改变的 subject。如果发生错误,返回 NULL。
这个函数有个 “/e” 漏洞,“/e” 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码进行执行。如果这么做要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。
获取 flag
也就是说只要在 sub 参数中有要搜索的 pat 的内容,同时将在 rep 前加上 “/e” 触发漏洞,就可以执行 replacement 中的 PHP 代码。sub 和 pat 的参数构造只要满足前面的条件就行,rep 参数则设置为 “system('ls')”,这句代码用于命令行执行 ls 命令获取目录下的所有文件。
执行成功,发现目录下的 s3chahahaDir 文件夹的名字很可疑,再次执行 ls 命令在该文件中查看内容。
执行成功,发现 s3chahahaDir 下有个 flag 文件夹,那就更可疑了,再次执行 ls 命令在该文件中查看内容。
执行成功,发现 flag 文件夹下有一个 flag.php 文件,使用 cat 命令查看文件。查看之后打开 F12,即可看到 flag。