XML接口中的SQL注入漏洞,往往因为开发者过于信任解析器或编码函数,而忽略了数据最终流向SQL查询时的上下文切换。当攻击者利用XML实体编码、CDATA区块或十六进制编码等手段对Payload进行变形时,传统的黑名单过滤和简单的字符转义会瞬间失效。这不是理论推演,而是大量支付回调接口、SOAP服务和企业内部API中真实存在的致命缺陷。
XML实体编码如何绕过单引号过滤在XML文档中,单引号可以通过实体'表示,双引号可以用"表示。许多WAF或输入过滤器只检查字面意义上的引号字符,而不会对XML实体进行解码后再检测。当应用程序使用XML解析器提取节点值后,解析器会自动将实体还原为原始字符,此时数据已经绕过了输入阶段的过滤,直接进入SQL拼接过程。
假设后端代码使用XPath或DOM解析提取用户名节点值,然后直接拼接到SQL语句中。攻击者提交的XML片段可以这样构造:
<user> <username>admin' OR '1'='1</username> </user>
解析器提取到的字符串是admin' OR '1'='1,但过滤器在原始XML层面检查时看到的是无害的'实体序列。这种时间差攻击利用了处理流水线中解码与校验的顺序错误。
CDATA区块允许在XML中嵌入包含特殊字符的原始文本,而无需使用实体编码。攻击者可以将恶意Payload包裹在CDATA中,使其在XML语法层面完全合法,同时绕过那些不理解CDATA语义的简单过滤器。例如:
<search> <keyword><![CDATA[test' UNION SELECT password FROM users--]]></keyword> </search>
如果过滤逻辑只对标签间的文本内容进行正则匹配,CDATA的<