2024CISCN Simple_php题解
我觉得一点都不simple,这是我做个最难的rce,但是有这么多人都做起了,不知道是自己太菜了还是啥
1 |
|
由于这里过滤了太多,所以一开始我想执行phpinfo(),想着怎么也得弄个回显出来吧,但是直接
1 | cmd=phpinfo() |
不行,搞了好久发现是对system函数理解不到位,这实际上是在尝试执行一个名为 phpinfo()
的 shell 命令,而不是执行 PHP 的 phpinfo()
函数。由于 phpinfo()
不是一个有效的 shell 命令,所以执行失败
system可以执行php脚本,可以构造
1 | cmd=php -r phpinfo(); |
既然确定了回显方式,那就去选取rce的类别,这里一直困扰我的是不仅过滤了很多命令,还过滤了引号,所以最终选择了无参数rce中的hex2bin方式去绕过
bin2hex代码用来加密payload:
1 |
|
这里注意eval是执行代码的函数,后面遵循PHP语法,加;
然后是选取了substr函数这里用的两个参数
1 |
|
这里本来想用0,即从头选取字符串到末尾,但是执行不了,就用这样的形式来呈现,从而绕过了引号
/var/www/html/里只有index.php
后面非常恶心,一顿在容器里面找flag,目录都翻遍了,让我一度想diss出题人(狗头保命)
于是我在网上看到说可以用find来找
1 | <?php |
最后找到/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 | <?php |
1 | flag{3ed20e8b-6953-4d78-9556-d31f28ae6d0a} |