某CMS由无危害问题引发的SQL注入漏洞
字数 677 2025-08-06 08:34:54
某CMS由无危害问题引发的SQL注入漏洞分析教学文档
漏洞背景
该文档分析某CMS系统中由看似无危害的问题引发的SQL注入漏洞,展示了如何从已有漏洞出发,通过深入思考发现更多潜在的安全问题。
漏洞发现过程
初始漏洞
- 在CMS系统中发现了一个SQL注入点,位于
/admin/ajax.php文件 - 漏洞参数:
type参数存在注入 - 注入点代码特征:
$type = $_GET['type'];
$sql = "SELECT * FROM table WHERE type='$type'";
深入挖掘思路
- 全局搜索类似代码模式:寻找所有使用
$_GET、$_POST等直接拼接SQL语句的位置 - 参数传递链分析:追踪参数从获取到使用的完整路径
- 过滤机制绕过:分析现有过滤机制的局限性
关键漏洞点
1. 直接SQL拼接
// 漏洞代码示例1
$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id=$id";
// 漏洞代码示例2
$username = $_GET['username'];
$sql = "SELECT * FROM users WHERE username='$username'";
2. 二次编码注入
// 开发者进行了简单的转义
$type = addslashes($_GET['type']);
// 但在后续使用中又被解码
$type = htmlspecialchars_decode($type);
$sql = "SELECT * FROM table WHERE type='$type'";
3. 动态表名/列名拼接
// 动态表名直接拼接
$table = $_GET['table'];
$sql = "SELECT * FROM $table WHERE id=1";
// 动态列名直接拼接
$order = $_GET['order'];
$sql = "SELECT * FROM users ORDER BY $order";
漏洞利用技术
1. 常规注入利用
-- 数字型注入
id=1 AND 1=CONVERT(int, (SELECT table_name FROM information_schema.tables))
-- 字符型注入
type=' UNION SELECT 1,2,user()-- -
2. 编码绕过技术
-- 使用十六进制编码
type=0x61646D696E27
-- 使用CHAR函数
type=CHAR(97,100,109,105,110,39)
3. 动态SQL利用
-- 通过表名注入
table=users UNION SELECT 1,2,3--
-- 通过列名注入
order=(SELECT CASE WHEN (1=1) THEN id ELSE name END)
防御方案
1. 参数化查询
// 使用PDO预处理
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$id]);
// 使用MySQLi预处理
$stmt = $mysqli->prepare("SELECT * FROM users WHERE username = ?");
$stmt->bind_param("s", $username);
2. 严格输入验证
// 数字型参数
$id = (int)$_GET['id'];
// 枚举型参数
$allowed_types = ['news', 'article', 'blog'];
if(!in_array($type, $allowed_types)) {
die('Invalid type');
}
3. 安全处理动态SQL
// 表名/列名白名单
$allowed_tables = ['users', 'posts', 'comments'];
if(!in_array($table, $allowed_tables)) {
die('Invalid table');
}
// 或使用映射方式
$table_map = [
'u' => 'users',
'p' => 'posts'
];
$table = $table_map[$_GET['t']] ?? 'default';
4. 多层防御
- 应用层:参数化查询+输入验证
- 数据库层:最小权限原则
- 系统层:WAF防护
漏洞挖掘方法论
- 从已知到未知:从已发现漏洞出发,寻找类似模式
- 参数追踪:完整跟踪参数从入口到使用的全过程
- 边界测试:测试各种输入边界情况
- 过滤绕过:尝试各种编码和特殊字符绕过
- 上下文分析:结合功能上下文寻找非常规注入点
总结
该案例展示了如何从表面简单的SQL注入漏洞出发,通过系统性的分析和思考,发现更多潜在的安全问题。关键在于:
- 不满足于单个漏洞的发现
- 理解漏洞的根本成因
- 建立系统的测试方法论
- 考虑各种可能的利用场景
这种思维方式对于全面评估系统安全性至关重要。