Findbugs 没有发现潜在的 SQL 注入漏洞

Posted

技术标签:

【中文标题】Findbugs 没有发现潜在的 SQL 注入漏洞【英文标题】:Findbugs not finding potential SQL injection vulnerability 【发布时间】:2010-09-28 17:32:01 【问题描述】:

我刚刚为 Eclipse 安装了 FindBugs 插件,希望它能帮助我找到代码中的 SQL 注入漏洞。然而,它似乎并没有找到任何东西,即使我故意放了一些。

在以下示例中,假设 staticFinalBaseQuery 声明如下:

public static final String staticFinalBaseQuery = "SELECT foo FROM table where id = '";

并假设 userInputfilterString 是包装示例 sn-ps 的方法的参数。它直接来自用户输入,没有经过处理。

例如,下面的 sn -p 不会触发警告:

String query = staticFinalBaseQuery + userInputfilterString;
pstmt = dbConnection.prepareStatement(query);

其中staticFinalBaseQuery 是一个静态的最终字符串,userInputfilterString 是一个直接来自用户输入的字符串,仅在运行时可用,根本不会被清除。显然,这是一个漏洞。

我预计会触发“A prepared statement is generated from a nonconstant String”警告。

以下 sn-p 也不会引起警告(并不奇怪,因为它们的编译形式可能相同):

pstmt = dbConnection.prepareStatement(staticFinalBaseQuery + userInputfilterString);

但是,这会导致警告:

pstmt = dbConnection.prepareStatement(staticFinalBaseQuery + userInputfilterString + "'");

如果我附加一个空字符串或一个空格,则不会触发任何警告。

那么,我的问题是,如何让 FindBugs 在我的第一个示例中触发?我也很好奇为什么第一个不会引起警告,但最后一个会?

提前致谢!

编辑:我submitted a bug 到 FindBugs 的错误跟踪系统,看来这​​可能是一个错误。但是,如果有人有任何提示,我很乐意听到。

【问题讨论】:

也许您应该将此作为错误报告给 FindBugs 的人? 是的,也许我应该这样做。我想也许我只是用错了。如果是这种情况,他们可能想要更新文档。 你能发布一下 staticFinalBaseQuery 和 userInputfilterString 是如何初始化的吗? @Juha,我刚刚编辑了问题以显示这些论点的来源。 【参考方案1】:

这里很难区分安全代码和不安全代码。当然,userInputfilterString 可能是不安全的,但在编译时不可能确定这一点。但是,字符串连接中的单引号字符是使用可注入代码的标志。这就是为什么 FindBugs 在包含此字符的行上触发,而不是在仅字符串连接的行上触发。

基本上,这不是错误,而是软件可以检查 SQL 注入的能力的限制。由于字符串可能包含 anything(即它可能在另一个函数中存在易受攻击的连接),因此无法让该工具确定存在问题。

【讨论】:

我刚刚编辑了问题以说明我希望 FindBugs 触发哪个检查,以及为什么我认为它应该将我的 sn-ps 显示为可能的错误。 我基本同意这个答案,但是在调用preparetament时肯定会发生非常量的连接,所以我也希望触发检查。【参考方案2】:

我认为PMD 或Checkstyle 也不会捕捉到它,但你可以尝试一下(我经常使用所有 3 个,很好用的工具)。

编辑:PMD 是正确的链接,但我称它为 findbugs... findbugs on the brain 我猜...

【讨论】:

【参考方案3】:

考虑升级到商业软件,例如 http://www.ouncelabs.com/,这将更好地服务于您的目的......

【讨论】:

以上是关于Findbugs 没有发现潜在的 SQL 注入漏洞的主要内容,如果未能解决你的问题,请参考以下文章

Sql 注入 MS Access

SQL漏洞概述

使用FindBugs-IDEA插件找到代码中潜在的问题

SQL注入专题

CVE-2020-7471-Django SQL注入漏洞复现

sql注入漏洞是哪个年份发生的呢?有没有啥重大的历史事件??