BUUCTF:[BJDCTF2020]ZJCTF,不过如此 && 攻防世界web之ics-05 -- -preg_replace + /e 的任意代码执行漏洞

目录

    • 一、不足:
    • 二、知识点:
    • 三、做完题,看完博客后的 要求:
    • 四、我的思路:没有做出来,,,
    • 五、真WP
    • 六、攻防世界web之ics-05的一些不足与收获

加一个题: 攻防世界web之ics-05
也是这个preg_replace

一、不足:

  1. 在文件包含那里卡住了,想着flag.php还是next.php10多分钟后才想到可以用filter协议来读么,,,等一会看看能不能用data协议来读去???
    这个可以的:index.php?text=data://text/plain,I have a dream&file=php://filter/convert.base64-encode/resource=next.php
  2. 看到正则+str_replace,+ e 修正符,想到的是RCE!?!!。
  3. 知识点:/e模式的preg_replace,有一个远程代码执行漏洞

二、知识点:

  1. 点这个:深入研究preg_replace与代码执行。讲真,里面的一些python的小脚本可以学习学习呦
  2. 看这个我自己吸收了一波之后的:正则中\1的用法—反向引用
  3. 那个可变变量的花括号,就像是C语言中的小括号一样,明确变量名字的,没有什么实际意义的
  4. 真就直接就执行了呗,(这里去掉花括号不行!!!不行!!!!)这个是给 第一点 实验用的。那个第一点中的 爬坑三 有详细解释。讲的很棒的,既然这个 ${phpinfo()} 能传,
  5. 这个 ** \S=${getFlag()} ** 的意思就是执行代码的意思了,我看了,大牛写的博客中也没有说为什么使执行代码,只是讲了怎么构造使之执行代码,。一样的 换成phpinfo()一样执行
    BUUCTF:[BJDCTF2020]ZJCTF,不过如此 && 攻防世界web之ics-05 -- -preg_replace + /e 的任意代码执行漏洞_第1张图片

三、做完题,看完博客后的 要求:

  1. 这个套路要会用,看到这个 preg_replace 和 /e 的组合运用的时候,要能够想到使这个代码执行来
    然后

  2. 正则的反向代理\1得会,

  3. 还有PHP得 可变变量 也要弄得明明白白的!

四、我的思路:没有做出来,,,

php://input 一下子想到了,但是这个文件包含的还是慢了点,这个php://input换成data伪协议也可以做的

这个可以的:index.php?text=data://text/plain,I have a dream&file=php://filter/convert.base64-encode/resource=next.php
BUUCTF:[BJDCTF2020]ZJCTF,不过如此 && 攻防世界web之ics-05 -- -preg_replace + /e 的任意代码执行漏洞_第2张图片
解码后这样://注释是我自己加的


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

/*总体作用好像,就是全部换成小写。。*/
function complex($re, $str) {
     
    return preg_replace(//i 是大小写,e是配合preg_replace使用的
        '/(' . $re . ')/ei',//把匹配来的字符串当作正则表达式执行
        'strtolower("\\1")',
        $str
    );
}


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

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

在这里插入图片描述
system给我整的没有回显了,,,,
然后里面有个session_id没有用上

所以我这里的思路有两个

  1. 包含session文件,getshell
  2. 用一个有会显的系统命令试一试。

这里的思路好像就不对了,但是做其他的提的时候可能有用哦。那个无回显的RCE看看我的那个ctfshow的博客,

不怎么好使之后,我就看WP了,,,,
差这最后一步,,

五、真WP

思路是利用这个代码执行,执行源码中的getFlag()函数,在传入cmd参数,再利用getFlag中的eval()函数,再进行一个代码执行。

问题来了:
他这个虽然定义了function,但是没有执行这个函数,我们要做的就是要使这个函数执行,然后传入执行的变量参数

然后payload:next.php?\S*=${getFlag()}&cmd=system('cat /flag');。这个 \S*=${getFlag()} 的意思就是执行代码的意思了,我看了,大牛写的博客中也没有说为什么使执行代码,只是讲了怎么构造使之执行代码,。一样的 换成phpinfo()一样执行,所以刚才说了。

我们要执行getFlag()方法(函数)的eval,那就执行啊,所以就套用格式,将phpinfo()换成了getFlag了,

然后就执行了这个函数了,就正常的命令执行, cmd = system(‘cat / flag’) 就好了

这个套路要会用,看到这个 preg_replace 和 /e 的组合运用的时候,要能够想到使这个代码执行来
然后

正则的反向代理\1得会,

还有PHP得 可变变量 也要弄得明明白白的!

六、攻防世界web之ics-05的一些不足与收获

  1. 还是老样子,以前是在源码中,看到include,file_get_content不够敏感,不能够第一时间反映出来是 文件包含漏洞来 。这次在url上面,也没有足够的敏感度。
  2. 阅读源码不够仔细,明明提交page参数的时候, 后面有die()这个函数,我却没看到,以后阅读源码的时候要细心。
  3. LFI黑盒判断的方法:
    从URL上看,URL中的 path , dir , file ,page, pag ,archibe, p ,eng ,等和文件,网页,下载相关的关键字眼的时候,都可能存在文件包含漏洞,

看这个
知道/e能够任意执行代码就好,相当于eval。这个没事多看看,,

preg_replace($pattern, $replacement, $subject);

这个自己构造的时候,pattern中一定要有/e,然后subject中能够和pattern中匹配,最简单的是subject=abc,pattern=/ab/e 。 然后replacement就是随意的代码执行了

preg_replace('/('. $regex.')/ei','strtolower("\1")',$value)

这个的模式是固定的。
串入 get参数 /\S*/e 。这个正则,就是不是空白字符任意多个匹配,然后 value 就是我们的任意命令了。
文章多看看就明白了

你可能感兴趣的:(BUUCTF刷题记录,RCE,php,正则表达式)