SQL注入在实战中通常有哪些绕过技巧?
对某菠菜的渗透测试笔记
渗透测试人员经常会遇到各种WAF防护,这让传统的SQL注入攻击变得困难重重。不过道高一尺魔高一丈,攻击者已经开发出多种巧妙的绕过技术。这些技术往往结合了编码混淆、逻辑特性和数据库特性,让防御系统防不胜防。
编码与大小写变换的艺术
最基本的绕过方式是对注入语句进行编码处理。URL编码、Base64编码、十六进制编码都能有效混淆payload。比如将UNION SELECT转换为%55%4e%49%4f%4e %53%45%4c%45%43%54,很多WAF规则就无法识别。
大小写混合也是个简单实用的技巧。像UnIoN SeLeCt这样的写法经常能骗过简单的正则检测。更高级的变种还包括在关键字中插入注释,比如U/**/NI/**/ON SEL/**/ECT,MySQL会忽略注释内容而正常执行。
利用数据库特有语法
不同数据库管理系统有着各自的语法特性,这些特性往往成为绕过的突破口。在MySQL中,可以使用反引号或双引号包裹关键字:UNION`SELECT`。SQL Server则支持用括号分隔语句:(U)(N)(I)(O)(N)(S)(E)(L)(E)(C)(T)。
更巧妙的是利用数据库的内联注释特性。MySQL的/*!50000union*/语法表示只有当MySQL版本大于5.00.00时才执行union操作,这种条件注释经常能绕过基于关键字的检测。
时间盲注与逻辑陷阱
当直接回显被阻断时,时间盲注就派上用场了。通过sleep()或benchmark()函数制造时间延迟,根据响应时间差推断数据内容。虽然速度较慢,但成功率相当可观。
有些WAF会对单个请求中的可疑字符数量进行限制。这时可以采用分块传输的方式,将完整的payload拆分成多个无害的小片段,在服务器端重新组合执行。
HTTP参数污染与多重编码
HTTP参数污染是个精妙的技巧。当传递多个同名参数时,不同Web服务器有不同的处理规则。比如在Apache中,最后一个参数值生效;而在IIS中,第一个参数值被采用。攻击者可以利用这种差异,在一个参数中放置正常值欺骗WAF,在另一个参数中放置恶意payload。
多重编码则是更加隐蔽的手段。对payload进行多次URL编码,比如双重编码甚至三重编码,有些WAF只进行一次解码检测,就会被成功绕过。
这些绕过技术不断演进,防御方需要采用纵深防御策略,包括输入验证、参数化查询、最小权限原则等多层防护,才能有效应对日益复杂的SQL注入攻击。

参与讨论
大小写混合这招确实实用
用注释分割关键字的方法绝了👍
有人试过在MySQL里用反引号吗?
时间盲注虽然慢但确实有效
HTTP参数污染在不同服务器上效果差好多啊
这些绕过技巧实战中真的能用上吗
之前测WAF时就栽在多重编码上
分块传输听起来很巧妙
编码混淆对某些老旧WAF特别管用
数据库特性这块讲得挺详细