拓冰建站拓冰建站
首页 / 资讯中心 / 正文

宽字节注入、二次注入、堆叠注入:高级 SQLi 专题

文章目录一、先共用一张脑图二、宽字节注入当“反斜杠”被吃掉1. 它在解决攻击者的什么问题2. 为什么说它是“年代感”很强的洞3. 授权测试时怎么意识到“可能是宽字节”4. 怎么修比背 payload 重要5. 一句收束三、二次注入安全地走进去危险地走出来1. 这是高级题里最“业务”的一种2. 常见真实长相3. 为什么自动化容易漏4. 授权测试怎么挖5. 怎么修6. 一句话四、堆叠注入一句请求多句 SQL1. 它到底是什么2. 为什么有的库“怎么都堆叠不了”3. 授权测试里怎么证明“支持堆叠”4. 危害为什么常被高估或低估5. 和存储过程、批处理的关系五、三专题对照怎么记才不容易混六、实战中的组合拳认识即可七、防御工程把专题落进日常1. 代码审计加三枚探针2. 测试用例别只砸“当前参数”3. 配置基线4. 监控八、收尾上一篇把 SQL 注入从手工到 sqlmap 走了一遍。有人读完会觉得参数化一上注入不就死了吗话是没错可真实项目里总有“历史包袱”和“聪明人自己造的轮子”——编码处理不一致、入库一次出库再拼一次、驱动居然允许多语句执行。于是就有了这三类更刁钻、也更容易在代码评审里漏掉的东西宽字节注入、二次注入、堆叠注入。一、先共用一张脑图普通注入用户输入 → 拼进 SQL → 当场爆炸。高级一点的缝隙往往在别处宽字节 “转义”和“数据库编码”不是同一套尺子逃逸字符被吃掉 二次注入 第一次像安全地存进去了第二次再拼 SQL 时才爆炸 堆叠注入 一条请求里塞多句 SQL数据库驱动居然肯挨个执行三者可以叠在一起出现但学习时最好分开想清楚。二、宽字节注入当“反斜杠”被吃掉1. 它在解决攻击者的什么问题很多老 PHP 代码喜欢用addslashes()、魔法引号、或自己在单引号前加\以为这样字符型注入就废了。想法很朴素变成\字符串闭合不了。宽字节注入盯的是另一处若连接数据库时用了某些多字节编码经典讨论最多的是GBK而转义又按“单字节思维”加反斜杠攻击者可以构造一种两字节组合——前一个字节把后面的\“吃进”一个合法汉字或其它多字节字符里于是重新露出原形重新具备闭合字符串的能力。人话版你以为你给引号穿了防弹衣前面加了\编码一搅合防弹衣和别人拼成了别的字引号又光着了。2. 为什么说它是“年代感”很强的洞它高度依赖应用层按字节做转义数据库链路仍是 GBK / GB2312 一类字符集在连接、库、表、客户端之间还不统一。今天大量系统默认 UTF-8 / utf8mb4宽字节这条路会窄很多。但别得意内网老 OA、老电商、政府项目、十年不升级的 PHP依旧能撞见。供应链里一个老组件也能把你拖回 GBK 时代。3. 授权测试时怎么意识到“可能是宽字节”线索通常很“运维”响应头或页面暗示国产老栈、GBK数据库/连接配置里能看到GBK、GB2312普通被转义看起来没戏但团队怀疑转义只做在应用层白盒直接搜addslashes、自制 escape、却未见真正参数化。黑盒下乱撞宽字节 payload既吵又容易误判。更稳的是先确认编码链路再在测试环境验证。能白盒就白盒。4. 怎么修比背 payload 重要按优先级彻底参数化——转义游戏直接退场全链路统一UTF-8 / utf8mb4连接串显式指定不要用addslashes当防注入方案对遗留库迁移编码时做好数据评估别只改半截。看到有人说“我们加了宽字节 WAF 规则”我会问编码统一了吗预编译了吗没有的话规则只是多一层运气。5. 一句收束宽字节注入教你的不是更花的攻击技巧而是任何“在字符串层面手工逃逸”的方案都要和字符编码绑在一起审查编码一错逃逸就可能失效。三、二次注入安全地走进去危险地走出来1. 这是高级题里最“业务”的一种二次注入Second-Order Injection的剧本常常是攻击者提交一段看起来无害、甚至通过了当下校验与转义的输入应用把它存进数据库之后另一次查询——可能是别的接口、定时任务、管理端功能、触发器——把库里的值取出来又拼进 SQL这时候才发生注入。第一次请求的日志可能完全干净安全测试如果只砸“当前参数”也会漏。我特别想强调二次注入不是因为攻击者更聪明而是因为开发把“存进去”和“再拿出来用”当成了两个世界。存的时候当脏数据防拿的时候当可信数据用。数据库不是信任根。2. 常见真实长相用户改昵称 / 地址 / 备注管理端按昵称搜索拼了 SQL注册用户名写进 profile某处WHERE user...又拼了一次工单系统、CMS 标签、导入的 Excel 字段安全设备或审计系统把“原始攻击串”存下再在报表里二次查询是的安全产品也干过这种事。有时候第一次输入还有长度限制、过滤关键字但存进去的是“半成品”二次拼接时过滤策略并不一致照样爆。3. 为什么自动化容易漏sqlmap 默认强在“当前请求的参数 → 当前响应”。二次注入需要找到写入点和触发点两者可能隔着角色、时间、甚至异步队列触发点不一定回显给你这个会话。所以它更吃业务理解。工具可以辅助替代不了脑。4. 授权测试怎么挖我自己的习惯步骤1画数据生命周期这个字段从哪里进、存在哪张表、哪些功能会读、读完干什么。像跟账一样跟字段。2特意埋探针在测试环境用可控账号把昵称/备注改成带特殊字符的“探针串”注意别破坏生产数据。然后去所有会用到该字段的管理功能、搜索、导出点一点。3看第二次查询是否参数化白盒最爽搜对该字段的二次拼接。黑盒就看触发时是否出现 SQL 异常、时间差、或业务结果异常。4别只测“当前用户能看的页面”二次触发经常在管理员视角、批处理、消息消费者里。测试账号体系要够。5. 怎么修说起来简单做起来要改习惯任何时候拼 SQL 都不信任“来自数据库的字符串”——它昨天可能来自用户二次查询同样参数化对业务上必须进 SQL 结构的字段极少见做白名单写入侧过滤不能替代读出侧安全代码审计 checklist 里加一条“取出再拼 SQL 的点”。有团队觉得“入库前已经 escape 了”。请回想宽字节escape 本身就不牢更何况二次使用时 escape 可能被解掉、或根本没带上。6. 一句话二次注入是信任边界画错了把“库里的”当成“干净的”。四、堆叠注入一句请求多句 SQL1. 它到底是什么堆叠Stacked Queries指在一次数据库执行里塞多条语句例如概念上的SELECT ...; UPDATE ...; --若驱动/接口允许一次执行多语句攻击者在注入点不仅能读还可能改数据、调存储过程危害面明显变宽。注意这和“UNION 注入”不是一路——UNION 是把查询拼进同一条 SELECT 的结果集堆叠是多条语句依次执行。2. 为什么有的库“怎么都堆叠不了”能不能堆叠很大程度取决于数据库类型与连接方式是否显式打开多语句选项历史上某些 PHP 连接方式对此很敏感中间件、ORM、预编译接口是否根本不支持一次丢多句。所以你会看到教材里写“MySQL 也可以堆叠”真打目标却纹丝不动——不一定是你菜可能是链路不允许。老手先试探是否支持多语句再谈利用。3. 授权测试里怎么证明“支持堆叠”在授权环境目标通常是证明风险而不是把库搅烂。优先用相对无害的时间差异、会话变量、或只读类确认严格避免随手DROP、大规模UPDATE与客户事先约定可执行边界。若手工不好证明sqlmap 等工具在授权下也有对应探测技术选项——仍要控速、控范围避免生产抖动。4. 危害为什么常被高估或低估高估以为有注入就一定能堆叠。不能。低估一旦能堆叠而账号权限又大危害从“拖库”跃迁到“改账、插后门用户、清数据”。修复时两刀一起砍堵住注入参数化连接配置关闭多语句若业务不需要数据库账号最小权限。即使将来又写出拼接也少一道“多语句”的翅膀。5. 和存储过程、批处理的关系业务合法地使用多语句 / 批处理时要分清入口管理任务用单独高权限连接面向用户的 Web 连接绝不打开多语句。别为了图省事共用一个 DSN。五、三专题对照怎么记才不容易混宽字节二次注入堆叠注入核心缝隙编码与转义不一致信任了库中数据再拼接驱动允许多语句何时爆当前请求拼 SQL 时往往在后续请求/任务当前执行点支持多句现代系统频率相对少UTF-8 普及仍常见看配置与驱动测试重点编码链路、伪转义字段生命周期是否允许多语句主修复参数化 统一编码全程参数化、不信任库字段参数化 关闭多语句 权限六、实战中的组合拳认识即可真实漏洞偶尔会“套娃”宽字节让转义失效 → 当前请求注入成功 → 若可堆叠则危害升级或第一次用宽字节写入恶意昵称 → 二次在管理端爆发。分析时按层剥输入怎么进有没有伪安全转义编码是什么最终哪一次query拼了它那次执行允许多句吗账号能干什么。能画完这六步报告会非常漂亮开发也没法用“我们有 addslashes”糊弄你。七、防御工程把专题落进日常1. 代码审计加三枚探针在 Code Review / 半自动审计里专门搜手工 escape /addslashes/ 自制safe_sql取出数据库字段后的字符串拼接连接配置里的多语句开关、过时驱动用法。2. 测试用例别只砸“当前参数”加两类用例编码相关遗留 GBK 系统业务字段写入后再在管理端/批处理触发。3. 配置基线连接字符集显式 utf8mb4应用账号禁止多余权限非必要关闭多语句生产禁止 SQL 明细回显。4. 监控短时间大量语法错误、异常多语句模式、管理端搜索功能报错飙升——都可能是二次注入被触发的侧写。和 WAF 日志对着看。八、收尾宽字节注入提醒你逃逸不是安全边界编码才可能让边界破产。二次注入提醒你数据库里的未必干净第二次拼接一样要命。堆叠注入提醒你语句执行器的能力边界也是安全边界能关的多语句就别开着。高级 SQLi 专题写到这里其实都在重复上一篇的那句老话——只是缝隙更隐蔽让用户数据永远只能当“值”不能当“语法”让信任只来自明确的白名单与绑定不来自“我曾经过滤过”。你若今晚只做一件事打开你们最老的那个业务库连接配置看字符集和是否多语句再找一个“用户可改、管理员可搜”的字段问开发第二次查询绑参了没有。这两眼比再背十个高级 payload 更值回票价。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门