PbootCMS任意代码执行
夜来风雨声 漏洞分析 12227浏览 · 2020-06-29 01:51

前言

今天看到该cms进行了更新,分享一下前段时间发现的一处安全问题

漏洞利用

写此文时笔者使用的是2.0.9测试版本,发布时间为2020-05-05,最新更新时间为2020-06-18

在github上下载源码

https://github.com/hnaoyun/PbootCMS

安装后去https://www.pbootcms.com/freesn/获取授权码,登录后台添加授权码即可

正常登录后台,在站点信息中插入如下代码并且保存

保存后我们来到前台首页,使用burpsuite进行抓包,将数据包中的cookie头设为assert,Proxy-Connection头设置为想要执行的php代码,测试图片中使用的代码为system('whoami') 如图

可以看到成功的执行了php代码

代码分析

漏洞可以利用的原因在于apps\home\controller\ParserController.php中parserIfLabel函数对if标签解析时安全检验做的不够全面,函数主要存在两处安全校验,如图

对于第一处if判断,我们可以在函数名和括号之间插入控制字符,如\x01,这样即可绕过该处正则校验,并且可以正常执行php代码,该trick来源于KCon2019的一个议题

完整的ppt可以参见文末链接

对于第二处对于敏感函数的过滤,完整的校验如下

if (preg_match('/(\$_GET\[)|(\$_POST\[)|(\$_REQUEST\[)|(\$_COOKIE\[)|(\$_SESSION\[)|(file_put_contents)|(file_get_contents)|(fwrite)|(phpinfo)|(base64)|(`)|(shell_exec)|(eval)|(assert)|(system)|(exec)|(passthru)|(print_r)|(urldecode)|(chr)|(include)|(request)|(__FILE__)|(__DIR__)|(copy)/i', $matches[1][$i])) {
                    $danger = true;
                }

在这里其实做的过滤并不全面,我们可以扩展思路,结合一些其他函数,例如call_user_func函数来进行利用,同时可以参考PHP无参数RCE的考点,将可控输入点转移到请求包的header头中,直接绕过cms中存在的一些过滤项,上面的利用方式中,使用了getallheaders()同时配合一些数组操作函数来达到执行任意代码的目的

参考链接

https://xz.aliyun.com/t/6316

PPT:https://github.com/knownsec/KCon/blob/master/2019/25%E6%97%A5/PHP%E5%8A%A8%E6%80%81%E7%89%B9%E6%80%A7%E7%9A%84%E6%8D%95%E6%8D%89%E4%B8%8E%E9%80%83%E9%80%B8.pdf

8 条评论
某人
表情
可输入 255
big****an21
2020-06-30 01:36 0 回复

这个漏洞在nginx下利用不了,因为getallheaders方法是apache专用的


啦啦0咯咯
2020-06-29 06:35 0 回复

@141492****@qq.co

哈哈哈,虽然涨了新姿势,但是看篇文章每张图片这样还是挺逗的哈哈哈


夜来风雨声
2020-06-29 06:29 0 回复

@chybeta 好的,修补好的文章已重新投递


chybeta
2020-06-29 04:58 0 回复

@夜来风雨声 建议把图片补充一下吧


141492****@qq.co
2020-06-29 03:44 0 回复

@啦啦0咯咯 用burp代理,把referer删除就ok了


夜来风雨声
2020-06-29 02:23 0 回复

@啦啦0咯咯 感谢提醒,文章我放在石墨中了,链接:https://shimo.im/docs/A1uTjeEwUQA7Cf3N


爱吃猫的闲鱼
2020-06-29 02:20 0 回复

酒仙桥六号部队也有一篇差不多的文章,有急需看的师傅可以去看下


啦啦0咯咯
2020-06-29 02:05 0 回复

老板 图全挂了,先知好像不支持外链


目录