RoarCTF最后一天放的题目,很有意思,熬夜搞出来了一血+1000分成功反超白泽23333

初探

题目是基于phpshe1.7最新版,感觉又是搞0day的,网上搜了下有CVE-2019-9762和一个XXE。但是 notify_url.php 被删掉了XXE搞不了了那就只能sqli。试了下

pay` union select 1,1,1,1,1,1,1,1,1,1,1,1 and sleep(3);-- -_123`

可以延时6s(被执行了两次?),接着就想着延时注入了,然而搞admin密码的时候发现字段名都有下划线,order_table 函数又会截断下划线,得想办法绕过字段名。

字段绕过

假设tb有3个字段

1
select * from tb

可以正常拿到所有的字段

1
select * from (select 1)a,(select 2)b,(select 3)c union select * from tb

这样可以用union自动重命名字段,到这里已经快可以了

1
select d.2 from (select * from (select 1)a,(select 2)b,(select 3)c union select * from tb)d

这句就可以绕过原来的字段名注入了,很神奇。官网包里有数据库的结构,admin表有6个字段。

按位爆出来md5查一下就能拿到密码了,然而进了后台找了一圈都没看到flag…

phar反序列化

这里先绕了点弯路,http://p0desta.com/2018/10/22/phpshe1.7%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/ 这里介绍了一个搞进数据库的方法,进去后找了一圈也没发现flag,我甚至dump了整个数据库也没有…

接着试了下和官网上源码diff一下,发现他改了一个Lib包,看到加了一个析构魔术方法,里面有解压文件的函数,基本就是phar反序列化了,可以控制解压的文件名。跟进之后在删除模板处有 is_file 文件函数,上传文件也被改成了只允许图片。

到这里攻击思路基本就清楚了,首先我们上传一个zip改后缀的图片(没有魔数检查),然后上传一个gif的phar,最后在删除模板处触发就能把zip里的shell解压出来了。

但是在触发的地方先发现问题……由于有token还有不知道什么地方的效验一直搞不了,最后只能通过改删除数据库备份这个相似的包搞定。然后又发现怎么也解压不出来……队友提醒了下是不是没有写权限,只能再覆盖解压目录改成上传目录,终于getshell了。

总结

这题还是很有意思的网上的0day不怎么管用很多都被封了要自己绕,最后还修改了一个包(构造方法改错了23333)。路径没写权限我以为是我phar的问题研究了半天原理ORZ…也好就当加强一下理解吧。