【问题标题】:False positive SQL Injection by ZAP in Spring MVCSpring MVC 中 ZAP 的误报 SQL 注入
【发布时间】:2019-01-23 06:46:20
【问题描述】:

我有一个由 ZAP 工具“主动扫描”的 spring-mvc Web 应用程序。它有两个针对 SQL 注入的高中警报,我认为这是误报。

  1. 原始 URL 是 /msg/showList?,它返回 200OK 和 json 消息列表。 ZAP 在运行扫描时添加了一个参数/deliverymsg/showList?query=query+AND+1%3D1+--+,它还返回 200 OK 和 json 消息列表。响应没有变化,列表相同。应用程序不会读取 ZAP 添加的参数“查询”,因此这里没有实际的 SQL 注入。 但 ZAP 将此警告为 HIGH 中。
  2. 原始URL为/filterlist?fromDate=&toDate=&_csrf=1534403682524,返回200Ok和list,ZAP正在扫描并添加SQL注入条件/filterlist?fromDate=&toDate=&_csrf=1534403682524+AND+1%3D1+--+ 该参数是 spring-boot 隐式添加的 csrf 令牌,应用程序实际上并未直接读取。但 ZAP 再次将此警告为“中高”。

我想了解 ZAP 在此处的工作原理,以及如何解决此误报,以免 ZAP 发出警报。我过去有过一些案例,我更改了应用程序代码以通过测试。但无法为此想出一个明确的解决方案。

我正在考虑添加HandlerInterceptor 并检查任何“AND”字的请求参数并返回 HTTP400,我不想这样做,因为这只是为了欺骗 ZAP 不警告 HIGH。 我知道我也可以提供误报的证据并在不修复的情况下发布它,但由于内部政策,我不能这样做。

我在 ZAP 附带的任何默认配置中运行它。

更新:

我添加了HandlerInterceptor 并拒绝了具有ANDquery 的请求,并且到目前为止仅针对报告的URL 重新运行ZAP 没有产生任何警报。我想知道这是为什么?因为ZAP创建的攻击URL有更多的sql关键字,如@9​​87654330@等。我只拒绝了两个关键字的请求。那如何解决问题?

为什么ZAP会附加它自己的参数query,应用程序永远不会读取,我不明白用query攻击背后的逻辑。

【问题讨论】:

  • 确定响应没有变化吗?这是通常的罪魁祸首
  • 没有变化。我比较了响应 json 和 header。不用找了。过去我有一个实例,其中 HTTP 响应状态为 404,并且正文不同,因为一个时间戳参数每次都会更改并提醒 ZAP。我通过删除时间戳来修复它。但这一次,响应体是一样的。没有变化,所以一无所知。
  • 你试过increase ZAP log levels吗? (当您将 ZAP 限制为仅对特定 url 使用特定规则时,您可能应该这样做)
  • 不,我没有。我将在下一次运行中这样做。这需要很长时间才能完成主动扫描。任何指针,我应该具体寻找什么?编辑:只会将其限制为 URL。谢谢。

标签: spring-mvc spring-boot sql-injection zap false-positive


【解决方案1】:

调查结果可能是误报。正如您可以想象的那样,在数十亿个潜在的 Web 实现中考虑应用程序行为的细微差异并不完全是直截了当的。根据此处提供的详细信息,很难说。通常对于 SQLi 警报,警报的“其他信息”部分中会提供其他信息,这些信息可能会提供有关 ZAP 测试和观察到的“怪异”的更多线索。

您可以在 UI (https://github.com/zaproxy/zap-core-help/wiki/HelpUiDialogsAddalert#confidence) 中或通过 Web API 将警报标记为误报。您还可以安装“上下文警报过滤器”插件并在您的上下文中创建规则,以便将来将这些设置为误报。 (假设您导出/导入您的上下文。)[有关上下文警报过滤器的更多详细信息,请点击此处 > https://github.com/zaproxy/zap-extensions/wiki/HelpAddonsAlertFiltersAlertFilter]

ZAP 的代码是开源且公开可用的,因此您可以随时查看 SQLi 扫描程序 (https://github.com/zaproxy/zap-extensions/blob/master/src/org/zaproxy/zap/extension/ascanrules/TestSQLInjection.java),如果您发现问题,请提交带有修复的 PR,或为团队打开新问题:https://github.com/zaproxy/zaproxy/issues

我添加了 HandlerInterceptor 并拒绝了具有 AND 或查询的请求,并且到目前为止仅针对报告的 URL 重新运行 ZAP 没有产生任何警报。我想知道这是为什么?因为 ZAP 创建的攻击 URL 有更多的 sql 关键字,如 UNION ALL 等。我只拒绝了两个关键字的请求。如何解决问题?

那么,您收到的警报与 UNION 注射没有任何关系,是吗?因此,只需防止发出警报的问题(通过过滤 AND 或查询),您就隐藏了 ZAP 分析的行为。此外,基于布尔的 SQLi 和基于联合的 SQLi 的检测机制是不同的。

当您运行包含输入向量“URL 查询字符串和数据驱动节点”的主动扫描时,任何不带参数的请求也将使用 query 参数进行尝试,因为这有时可能会发现未知处理(或错误处理)在网络应用程序中,以及一些可能无法检测到的 DOM XSS 等。

【讨论】:

  • 我对添加HandlerInterceptor 并不感到自豪,但我不知道如何跳过此any request without a parameter will also be tried with the query parameter 并在给定的时间范围内发布。我需要测试的另一个理论是 ZAP 正在同时测试 createget list,并且由于我忽略了同时出现的 createget list 可能会发生变化。我再比较一下。由于业务部门的政策,我还没有将警报标记为误报的奢侈,所以..但这是我的问题,不在这个问题的范围内。谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 2018-12-20
  • 2019-05-01
  • 2019-09-02
  • 1970-01-01
  • 2018-01-30
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多