Toolsmith #125: ZAPR - OWASP ZAP API R接口
我真诚地希望当我说OWASP Zed Attack Proxy(ZAP)时,你的反应是“太棒了!”而不是“那是什么?”。本出版物长期支持ZAP,除了@psiinon卓越的项目领导外,众多杰出的贡献者和实践者也促进了OWASP ZAP的发展。在过去的四年中,OWASP ZAP在@ToolsWatch最佳工具调查中一直名列第一或第二,这是有充分理由的。多年来,OWASP ZAP的使用已被充分记录和展示,wiki为您提供了大量内容供您探索OWASP ZAP用户场景。
我最近试图探索的一个较新场景是使用OWASP ZAP API。OWASP ZAP API也有详细的文档,足以让您入门,但请考虑几个用例场景。
首先,有一个功能齐全、简洁的OWASP ZAP API UI,在您考虑编程机会时为您提供查看者的视角。OWASP ZAP API交互基于URL,您可以调用访问视图和操作。探索任何组件,您会立即找到相关的视图或操作。通过http://localhost:8067/UI/core/(我在8067端口运行OWASP ZAP,您的安装可能不同)深入核心,我有很多选择。
您需要API密钥来构建查询。您可以通过Tools | Options | API | API Key找到您的密钥。例如,深入numberOfAlerts (baseurl),它获取警报数量,可选地按URL过滤。然后您将看到查询构建器,您可以在其中输入密钥、定义特定参数并决定首选的输出格式,包括JSON、HTML和XML。
当然,您会在浏览器中收到结果,此查询将以HTML表格形式提供答案,但这些不一定最适合程序化数据消费和操作。也就是说,您学到了本课最重要的部分,一个完全填充的OWASP ZAP API GET URL:http://localhost:8067/HTML/core/view/numberOfAlerts/?zapapiformat=HTML&apikey=2v3tebdgojtcq3503kuoq2lq5g&formMethod=GET&baseurl=。
此请求将以HTML返回结果。非常直接且易于根据您的偏好修改,但HTML结果不太适合机器处理。想要JSON结果吗?只需在URL中将HTML替换为JSON,或在构建器中选择JSON。我会告诉您,当我通过R等工具使用OWASP ZAP API时,我更喜欢使用JSON。这无疑是最干净、机器可消费的选项,尽管其他人可能会与我争论支持XML。
请允许我为您提供一个可以实验的示例,我可能会继续开发它,因为它对于动态报告OWASP ZAP扫描中的活动或会话完成时的结果非常酷。请注意,我所有的代码,可能很粗糙,都可以在GitHub上找到。我的意思是,这真的是v0.1的东西,所以请根据您的意愿贡献和调试。同样重要的是要注意,OWASP ZAP需要运行,无论是使用活动扫描会话还是您之前保存的存储会话。我扫描了我的网站holisticinfosec.org,并在编写本文时保存了会话以供常规使用。您甚至可以通过下面的位置看到保存会话的引用。
R用户可能知道Shiny,一个用于R的Web应用程序框架及其仪表板功能。我还发现rCharts设计用于在Shiny中交互式和美观地工作。
R包含使从JSON解析变得相当直接的包,正如我从Zev Ross那里学到的。RJSONIO使得从OWASP ZAP API提取数据变得容易,如fromJSON("http://localhost:8067/JSON/core/view/alerts/?zapapiformat=JSON&apikey=2v3tebdgojtcq3503kuoq2lq5g&formMethod=GET&baseurl=&start=&count=")。我们使用fromJSON“函数及其方法读取JSON格式的内容并将其反序列化为R对象”,其中ZAP API URL是该内容。
我使用Zev的grabInfo函数进一步解析了警报数据,并将结果组织成一个数据框(ZapDataDF)。然后,我将来自ZapDataDF的警报内容进一步排序为用于报告和可视化的有用对象。在每个警报对象中,有风险级别、警报消息、CWE ID、WASC ID和插件ID等值。使用以下代码将这些值中的每一个定义为对R有用的参数:
risk <- unlist(lapply(json, function(x) { x$risk }))
message <- unlist(lapply(json, function(x) { x$message }))
cweid <- unlist(lapply(json, function(x) { x$cweid }))
wascid <- unlist(lapply(json, function(x) { x$wascid }))
pluginid <- unlist(lapply(json, function(x) { x$pluginid }))
然后我将所有这些结果组合到另一个我称为reportDF的数据框中,其结果如下图所示。
现在我们有一些可以 pivot 的内容。
首先,让我们总结发现并通过ZAPR:OWASP ZAP API R接口展示它们的光彩。
代码优先,真正简单的东西:
zapoverview <- fromJSON("http://localhost:8067/JSON/core/view/alertsSummary/?zapapiformat=JSON&apikey=2v3tebdgojtcq3503kuoq2lq5g&formMethod=GET")
摘要概述API调用
您可以看到,我们只是使用RJSONIO的fromJSON进行特定的ZAP API调用。结果非常整洁,如下所示。
Shiny中我最喜欢的功能之一是renderDataTable函数。当在Shiny仪表板中使用时,它使过滤结果变得轻而易举,因此被用作ZAPR中的第一个真正功能。代码很繁琐,请从GitHub查看或使用,但结果应该不言自明。我按CWE ID 89过滤了视图,在这种情况下有点误报,我有一个非常平坦的网站,没有数据库,非常感谢。尽管如此,有一个肯定是高风险发现的例子是好的。
警报过滤很好,随着我进一步开发,我会添加更多结果功能,但可视化也很重要。这就是rCharts在Shiny中真正发挥作用的地方,因为它们是交互式的。我使用了最简单的例子,但您会明白的。首先,几行R代码,如下所示。
h1 <- hPlot(x = "risk", y = "count", data = riskcount, type = "bar")
h1$title(text = "Alerts by Risk")
h1$xAxis(title = "Risk Level")
h1$yAxis(title = "Count")
h1
图表代码
结果看起来更令人满意,并允许交互性。Ramnath Vaidyanathan在这里做了非常好的工作。首先,通过API提取的OWASP ZAP警报按风险在条形图中计数。
当我将鼠标悬停在Medium上时,我们可以看到我的OWASP ZAP扫描holisticinfosec.org specifically有17个结果。
我们的第二个可视化是按计数显示的CWE ID结果,在一个经常被鄙视但交互式的饼图中(是的,我在布局方面还有一些工作要做)。
正如我们之前了解到的,我在会话期间只有一个CWE ID 89命中,可视化支持了我们在数据表中看到的内容。
从OWASP ZAP API提取数据并将结果纳入任何数量的应用程序或报告场景的可能性是无限的。我感觉到这里有一个与PowerBI相关的丰富机会,我打算探索。所有代码都在这里,以及我提到的OWASP ZAP会话,所以您可以自己使用。您需要OWASP ZAP、R和RStudio来使一切协同工作,如果您有问题或建议,请告诉我。
干杯,下次见。