Spring MVC中ZAP的误报SQL注入

时间:2018-08-16 10:25:14

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

我有一个spring-mvc Web应用程序,该应用程序通过ZAP工具进行了“主动扫描”。对于SQL注入,它具有两个高中警报,我认为这是一个误报。

  1. 原始URL为/msg/showList?,它返回200OK和消息的json列表。 ZAP在运行扫描时,添加了一个参数/deliverymsg/showList?query=query+AND+1%3D1+--+,该参数还返回200 OK和消息的json列表。响应没有变化,列表相同。该应用程序不会读取ZAP添加的参数“查询”,因此此处没有实际的SQL注入。 但是ZAP将此警告为“高中”。
  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关键字,例如UNION ALL等。我只拒绝了两个关键字的请求。那怎么解决问题呢?

为什么ZAP会附加它自己的参数query,应用程序将永远不会读取它,我不理解使用query进行攻击的逻辑。

1 个答案:

答案 0 :(得分:1)

发现可能是假阳性。您可以想象,在数十亿个潜在的Web实现中对应用程序行为的细微差异进行会计处理并非一帆风顺。根据此处提供的详细信息,很难说。通常,对于SQLi警报,警报的“其他信息”部分中会包含其他信息,这些信息可能会提供有关ZAP测试和观察到的“怪异”的进一步线索。

您可以在用户界面(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,或为团队打开一个新问题:{ {3}}

  

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

您收到的警报与UNION注射无关吗?因此,仅需预防(通过过滤“与”或查询)已被警告的问题,您就可以从ZAP分析中隐藏行为。此外,基于布尔的SQLi和基于联合的SQLi的检测机制是不同的。

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