我希望完全了解如何从将插入 DB2 SQL 查询的用户输入中正确过滤/转义危险字符。
我正在分析的清理路由是这样工作的:
- 删除所有反斜杠( s/\\// )
- 用双单引号( s/'/''/ )替换所有单引号
我的第一直觉是检查现有的 db2 清理功能,以检查是否存在任何差异。所以我看了一下db2_real_escape_string,事实证明,它完全不同:它在字符串参数中的特殊字符前面加上反斜杠。前面带有反斜杠的字符是 \x00、\n、\r、\、'、" 和 \x1a。
我的一些具体问题是:
- 为什么 db2_real_escape_string() 反斜杠转义引号而不是加倍?这似乎不正确。
- 我正在分析的清理功能无法转义或过滤 \x00、\n、\r、\x1a、“。攻击者如何滥用这些字符?这是我的主要问题。
- 我的清理功能的另一个缺陷是它不支持字符集,但我猜这不是问题,因为在这种情况下,db2 被配置为使用默认字符集(我猜是' t 多字节)。所以 AFAIK,除非配置了像 GBK 这样的多字节字符集,否则像mysql GBK 中的这个已知漏洞这样的多字节 sql 注入攻击应该不是问题。
- 我正在分析的清理功能是否缺少任何其他注意事项/步骤?
我知道使用参数化查询是显而易见的解决方案。但是,在这种情况下,我负责 A) 确定当前设计是否可利用,以及 B) 为清理功能提供补丁(如果有必要)。
编辑考虑到上述清理功能和以下用法,我基本上希望构建一个概念验证 sql 注入有效负载:
execute( " SELECT foo FROM bar WHERE col='" + my_sanitize($_GET['input']) + "'" )
鉴于当前的清理功能设计(删除反斜杠和双引号),有没有办法像上面的用法示例那样打破单引号?
感谢你的协助!