一文详述SQL注入
字数 3122 2025-08-29 08:29:36

SQL注入全面解析与实战指南

一、SQL注入基础概念

1.1 漏洞描述

SQL注入是指Web应用对用户输入数据没有经过严格判断和过滤,用户输入的参数被直接带入数据库作为查询参数执行。攻击者通过构造特殊参数改变SQL语句原本逻辑,执行攻击者指定的操作(如查询数据、下载数据、写入webshell、执行系统命令以及绕过登录限制等)。

本质:违背"数据与代码分离"原则,把用户输入的参数当作代码执行。

1.2 SQL注入条件

  1. 用户可以控制前端传给后端的参数内容
  2. 用户输入的参数会被带入数据库,拼接到SQL语句中进行查询

二、MySQL相关知识

2.1 information_schema库

MySQL 5.0+默认包含的数据库,重点关注三个表:

  • SCHEMATA:存储用户创建的所有数据库名(SCHEMA_NAME字段)
  • TABLES:存储所有数据库的库名和表名(TABLE_SCHEMA和TABLE_NAME字段)
  • COLUMNS:存储所有数据库的库名、表名和字段名(TABLE_SCHEMA、TABLE_NAME和COLUMN_NAME字段)

2.2 常用函数

  • DATABASE():返回当前选择的数据库名
  • VERSION():返回MySQL服务器版本信息
  • USER():返回当前MySQL会话登录用户信息

2.3 注释符

  • #:单行注释(URL编码为%23)
  • -- :单行注释(URL中用"+"或%20表示空格)
  • /*...*/:多行注释
  • /*! code */:内联注释(MySQL特定版本执行)

2.4 参数位置

  • URL中(GET请求)
  • POST请求体
  • COOKIE
  • 其他请求头

2.5 参数数据类型

  • int整型:select * from users where id=1
  • string字符型:select * from users where username='admin'
  • like搜索型:select * from news where title like '%标题%'

三、Union联合注入

3.1 关键技术

  • UNION:合并多个SELECT结果集
  • ORDER BY:通过列名或位置排序,可判断列数
  • 占位符:临时填充查询位置(如SELECT 1,2,3
  • 子查询:嵌套查询技术
  • LIMIT:限制返回记录数(LIMIT offset,count
  • GROUP_CONCAT():将分组内多行值连接成字符串
  • CONCAT():拼接多个字符串

3.2 漏洞利用步骤

  1. 注入测试:通过添加单引号和注释符测试注入点
  2. 判断列数:使用ORDER BY n逐步增加n直到报错
  3. 确定回显位:使用UNION SELECT 1,2,...查看哪些列会显示
  4. 信息收集
    • 版本和数据库:union select version(),database()
    • 表名:union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa'
    • 字段名:union select 1,group_concat(column_name) from information_schema.columns where table_schema='dvwa' and table_name='users'
    • 数据内容:union select group_concat(user),group_concat(password) from users

四、Boolean布尔盲注

4.1 关键技术

  • IF()IF(condition, true_value, false_value)
  • SUBSTRING()/SUBSTR()/MID():提取子字符串
  • LEFT()/RIGHT():从开头/末尾提取字符串
  • LENGTH():计算字符串字节长度
  • CHAR_LENGTH():计算字符串字符数

4.2 漏洞利用

  1. 注入测试:使用and 1=1and 1=2验证注入
  2. 信息获取
    • 数据库名长度:and length(database())=n
    • 逐个字符猜测:and substr(database(),1,1)='a'
  3. 自动化工具:使用Burpsuite的Intruder模块(Cluster bomb模式)加速猜测过程

五、报错注入

5.1 关键技术

  • floor():结合rand()和group by制造报错
  • extractvalue():XML解析函数,用于报错显示
  • updatexml():XML修改函数,报错显示(限制32字符)
  • 几何函数:geometrycollection(), multipoint(), polygon()等
  • exp():数学函数制造报错

5.2 漏洞利用

  1. 获取库名and updatexml(1,concat(0x7e,database(),0x7e),1)
  2. 获取表名and (select 1 from (select count(*),concat((SELECT concat(0x7e,table_name,0x7e) FROM information_schema.tables where table_schema=database() LIMIT 0,1), floor(rand(0)*2))x from information_schema.tables group by x)a)
  3. 获取字段和数据:类似方法逐步获取

六、时间注入

6.1 关键技术

  • SLEEP():暂停执行指定秒数
  • BENCHMARK():重复执行表达式评估性能

6.2 漏洞利用

  1. 基本测试and if(2>1,sleep(5),1)观察响应时间
  2. sqlmap自动化
    sqlmap -u "url" -p name -v 1 --technique=T
    sqlmap -u "url" -p name -v 1 --technique=T --current-user --current-db --batch
    sqlmap -u "url" -p name -v 1 --technique=T -D dbname --tables --batch
    

七、其他注入类型

7.1 堆叠注入

  • 原理:利用mysqli_multi_query()一次执行多条SQL语句
  • 利用:在注入点后添加分号和新语句,如; insert into users values(...)

7.2 二次注入

  • 原理:第一次插入时转义特殊字符,但存储时恢复原状;第二次使用时直接拼接导致注入
  • 利用:注册含特殊字符的用户名,后续操作触发注入

7.3 宽字节注入

  • 原理:GBK等双字节编码导致转义字符被"吃掉"
  • 利用:使用%df%27等组合绕过转义

7.4 COOKIE注入

  • 原理:从COOKIE获取未过滤的参数
  • 利用:修改COOKIE值进行注入

7.5 Base64编码注入

  • 原理:参数Base64解码后直接拼接SQL
  • 利用:将注入语句Base64编码后提交

7.6 HTTP头注入(XFF、User-Agent等)

  • 原理:从HTTP头获取未过滤的参数
  • 利用:修改对应头字段进行注入

八、防御措施

  1. 使用参数化查询(预处理语句)
  2. 对输入进行严格过滤和转义
  3. 最小权限原则,数据库账户限制权限
  4. 关闭错误回显
  5. 使用Web应用防火墙(WAF)
  6. 定期安全审计和漏洞扫描

九、工具推荐

  1. sqlmap:自动化SQL注入工具
  2. Burpsuite:用于手动测试和自动化猜测
  3. Havij:图形化SQL注入工具
  4. NoSQLMap:针对NoSQL数据库的注入工具

通过全面理解这些注入技术和防御措施,安全人员可以更有效地发现和修复SQL注入漏洞,开发人员也能编写更安全的代码。

SQL注入全面解析与实战指南 一、SQL注入基础概念 1.1 漏洞描述 SQL注入是指Web应用对用户输入数据没有经过严格判断和过滤,用户输入的参数被直接带入数据库作为查询参数执行。攻击者通过构造特殊参数改变SQL语句原本逻辑,执行攻击者指定的操作(如查询数据、下载数据、写入webshell、执行系统命令以及绕过登录限制等)。 本质 :违背"数据与代码分离"原则,把用户输入的参数当作代码执行。 1.2 SQL注入条件 用户可以控制前端传给后端的参数内容 用户输入的参数会被带入数据库,拼接到SQL语句中进行查询 二、MySQL相关知识 2.1 information_ schema库 MySQL 5.0+默认包含的数据库,重点关注三个表: SCHEMATA :存储用户创建的所有数据库名(SCHEMA_ NAME字段) TABLES :存储所有数据库的库名和表名(TABLE_ SCHEMA和TABLE_ NAME字段) COLUMNS :存储所有数据库的库名、表名和字段名(TABLE_ SCHEMA、TABLE_ NAME和COLUMN_ NAME字段) 2.2 常用函数 DATABASE() :返回当前选择的数据库名 VERSION() :返回MySQL服务器版本信息 USER() :返回当前MySQL会话登录用户信息 2.3 注释符 # :单行注释(URL编码为%23) -- :单行注释(URL中用"+"或%20表示空格) /*...*/ :多行注释 /*! code */ :内联注释(MySQL特定版本执行) 2.4 参数位置 URL中(GET请求) POST请求体 COOKIE 其他请求头 2.5 参数数据类型 int整型: select * from users where id=1 string字符型: select * from users where username='admin' like搜索型: select * from news where title like '%标题%' 三、Union联合注入 3.1 关键技术 UNION :合并多个SELECT结果集 ORDER BY :通过列名或位置排序,可判断列数 占位符 :临时填充查询位置(如 SELECT 1,2,3 ) 子查询 :嵌套查询技术 LIMIT :限制返回记录数( LIMIT offset,count ) GROUP_ CONCAT() :将分组内多行值连接成字符串 CONCAT() :拼接多个字符串 3.2 漏洞利用步骤 注入测试 :通过添加单引号和注释符测试注入点 判断列数 :使用 ORDER BY n 逐步增加n直到报错 确定回显位 :使用 UNION SELECT 1,2,... 查看哪些列会显示 信息收集 : 版本和数据库: union select version(),database() 表名: union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa' 字段名: union select 1,group_concat(column_name) from information_schema.columns where table_schema='dvwa' and table_name='users' 数据内容: union select group_concat(user),group_concat(password) from users 四、Boolean布尔盲注 4.1 关键技术 IF() : IF(condition, true_value, false_value) SUBSTRING()/SUBSTR()/MID() :提取子字符串 LEFT()/RIGHT() :从开头/末尾提取字符串 LENGTH() :计算字符串字节长度 CHAR_ LENGTH() :计算字符串字符数 4.2 漏洞利用 注入测试 :使用 and 1=1 和 and 1=2 验证注入 信息获取 : 数据库名长度: and length(database())=n 逐个字符猜测: and substr(database(),1,1)='a' 自动化工具 :使用Burpsuite的Intruder模块(Cluster bomb模式)加速猜测过程 五、报错注入 5.1 关键技术 floor() :结合rand()和group by制造报错 extractvalue() :XML解析函数,用于报错显示 updatexml() :XML修改函数,报错显示(限制32字符) 几何函数 :geometrycollection(), multipoint(), polygon()等 exp() :数学函数制造报错 5.2 漏洞利用 获取库名 : and updatexml(1,concat(0x7e,database(),0x7e),1) 获取表名 : and (select 1 from (select count(*),concat((SELECT concat(0x7e,table_name,0x7e) FROM information_schema.tables where table_schema=database() LIMIT 0,1), floor(rand(0)*2))x from information_schema.tables group by x)a) 获取字段和数据 :类似方法逐步获取 六、时间注入 6.1 关键技术 SLEEP() :暂停执行指定秒数 BENCHMARK() :重复执行表达式评估性能 6.2 漏洞利用 基本测试 : and if(2>1,sleep(5),1) 观察响应时间 sqlmap自动化 : 七、其他注入类型 7.1 堆叠注入 原理 :利用 mysqli_multi_query() 一次执行多条SQL语句 利用 :在注入点后添加分号和新语句,如 ; insert into users values(...) 7.2 二次注入 原理 :第一次插入时转义特殊字符,但存储时恢复原状;第二次使用时直接拼接导致注入 利用 :注册含特殊字符的用户名,后续操作触发注入 7.3 宽字节注入 原理 :GBK等双字节编码导致转义字符被"吃掉" 利用 :使用 %df%27 等组合绕过转义 7.4 COOKIE注入 原理 :从COOKIE获取未过滤的参数 利用 :修改COOKIE值进行注入 7.5 Base64编码注入 原理 :参数Base64解码后直接拼接SQL 利用 :将注入语句Base64编码后提交 7.6 HTTP头注入(XFF、User-Agent等) 原理 :从HTTP头获取未过滤的参数 利用 :修改对应头字段进行注入 八、防御措施 使用参数化查询(预处理语句) 对输入进行严格过滤和转义 最小权限原则,数据库账户限制权限 关闭错误回显 使用Web应用防火墙(WAF) 定期安全审计和漏洞扫描 九、工具推荐 sqlmap :自动化SQL注入工具 Burpsuite :用于手动测试和自动化猜测 Havij :图形化SQL注入工具 NoSQLMap :针对NoSQL数据库的注入工具 通过全面理解这些注入技术和防御措施,安全人员可以更有效地发现和修复SQL注入漏洞,开发人员也能编写更安全的代码。