编写数据库防火墙以阻止 SQL 注入攻击

Writing a database firewall for blocking SQL Injection attacks

提问人:crypto 提问时间:2/12/2019 更新时间:10/31/2023 访问量:547

问:

我正在学习和研究SQL注入的不同方法和对策。

检查 HackerOne Hacktivities 后发现,Web 应用程序仅使用 WAF(例如 Cloudfront、cloudflare、Akamai 等)是不够的,因为黑客使用和构建 WAF 绕过有效负载来克服这些技术以使攻击成功。

在互联网上搜索了数据库防火墙关键字,但大多数链接都与Oracle数据库防火墙有关。

因为我目前正在研究SQL注入和对策。我很想知道我怎样才能研究和开发一个好的数据库防火墙,它就像一个代理,并使用主动监控引擎分析SQL查询,以监控和阻止SQL恶意负载。

除了编程语言之外,您还为我提供了哪些方法或技术来编写此类应用程序,您是否为我提供了开始研究和编写低级应用程序防火墙(如Windows驱动程序工具包中提供的示例)或应用程序层防火墙?

最后,我们是否可以将 Web 应用程序防火墙术语用作数据库防火墙的术语,它们之间有什么区别?

提前致谢。

SQL注入 Web应用程序防火墙

评论


答:

1赞 Bill Karwin 2/12/2019 #1

我在OWASP上推荐这个资源,以及它链接到的演示文稿。https://www.owasp.org/index.php/WASC_OWASP_Web_Application_Firewall_Evaluation_Criteria_Project

WAF 可以处理多种类型的安全问题,不仅限于 SQL 注入。例如 XSS、CSRF、cookie 中毒等。这些不一定与数据库有任何关系。

数据库防火墙更具体地用于阻止或至少检测 SQL 注入,或者如果您使用非 SQL 数据库,则用于等效注入。

检测被篡改的 SQL 很困难。我读到的数据库防火墙产品很难避免误报(错误识别不良内容)和漏报(无法检测到不良内容)。

Oracle 产品的最新版本已将重点转移到允许列表上。也就是说,承认通过算法检测不良内容太容易出错。相反,请训练数据库防火墙,哪些查询对于给定应用是合法的。

这意味着每次更改应用代码和添加/删除/修改 SQL 查询时,都必须在部署之前重新训练数据库防火墙,否则合法的查询流量将被阻止。这意味着部署应用需要执行更多步骤,这会增加复杂性并延迟部署。

对于需要高度可配置的查询,例如,如果您的应用代码在 WHERE 子句或多个 UNION 子句中附加了多个布尔术语,或者运行列数为动态的透视查询,则允许列表也是一个问题。

如果系统在存储过程中使用动态 SQL,则允许列表也无效,因为查询可能使用不受信任的内容进行格式化,并存在 SQL 注入漏洞。这些查询直接在 RDBMS 引擎中执行,从不通过数据库防火墙。因此,它们无法被过滤或检测。

ModSecurity 是开源 WAF 的一个示例,其中包含一些 SQL 注入检测功能。它是 Apache http 服务器的一个模块。

Libinjection 是可嵌入 SQL 解析器的一个示例,它可以尝试检测 SQL 注入。我没有使用过它,但我怀疑它与其他所有基于模式的方法一样,在准确性方面存在同样的不确定性。

我仍然认为,防御 SQL 注入的最佳方法是防御性编码。假设恶意内容传入,并使用 SQL 查询参数编写代码来拒绝恶意内容或确保内容无害。