GoTestWAF 是一个用于API和OWASP攻击模拟的工具,支持多种API协议,包括REST、GraphQL、gRPC、SOAP、XMLRPC等。
它旨在评估Web应用程序安全解决方案,如API安全代理、Web应用防火墙、IPS、API网关等。
GoTestWAF生成恶意请求,将编码后的有效载荷放置在HTTP请求的不同部分:主体、头部、URL参数等。生成的请求会发送到启动GoTestWAF时指定的应用安全解决方案URL。安全解决方案的评估结果会记录在您机器上创建的报告文件中。
请求生成的默认条件在testcases文件夹中的YAML文件中定义,格式如下:
payload: - '"union select -7431.1, name, @aaa from u_base--w-' - "'or 123.22=123.22" - "' waitfor delay '00:00:10'--" - "')) or pg_sleep(5)--" encoder: - Base64Flat - URL placeholder: - UrlPath - UrlParam - JSUnicode - Header type: SQL Injection
payload是恶意攻击样本(例如XSS有效载荷如<script>alert(111)</script>或更复杂的内容)。
由于YAML字符串格式对有效载荷是必需的,它们必须编码为二进制数据。
encoder是在将有效载荷放入HTTP请求之前应用于有效载荷的编码器。可能的编码器有:
placeholder是编码后的有效载荷应该放置的HTTP请求内部位置。可能的占位符有:
RawRequest占位符允许您进行任意HTTP请求。通过替换URL路径、头部或主体中的{{payload}}字符串来替换有效载荷。RawRequest占位符的字段:
methodpathheadersbodyRawRequest占位符的必填字段:
method字段示例:
payload: - test encoder: - Plain placeholder: - RawRequest: method: "POST" path: "/" headers: Content-Type: "multipart/form-data; boundary=boundary" body: | --boundary Content-disposition: form-data; name="field1" Test --boundary Content-disposition: form-data; name="field2" Content-Type: text/plain; charset=utf-7 Knock knock. {{payload}} --boundary-- type: RawRequest test
type是文件中整个有效载荷组的名称。它可以是任意的,但应反映文件中的攻击类型。
请求生成是一个三步过程,涉及有效载荷数量乘以编码器和占位符数量。假设您定义了2个有效载荷,3个编码器(Base64、JSUnicode和URL)和1个占位符(URLParameter - HTTP GET参数)。在这种情况下,GoTestWAF将在一个测试用例中发送2x3x1 = 6个请求。
在启动GoTestWAF时,您还可以在两个内置测试用例之间选择:OWASP Top-10、OWASP-API,或者使用您自己的(通过使用配置选项testCasePath)。
以下步骤将指导您使用最少的配置在Docker上下载和启动GoTestWAF。
从Docker Hub拉取GoTestWAF镜像:
docker pull wallarm/gotestwaf
启动GoTestWAF镜像:
docker run --rm --network="host" -it -v ${PWD}/reports:/app/reports \ wallarm/gotestwaf --url=<被评估的安全解决方案URL>
如果需要,您可 以将${PWD}/reports替换为用于放置评估报告的另一个文件夹的路径。
如果您不想选择通过电子邮件发送报告,只需在出现电子邮件请求消息后按Enter键,或者可以使用--noEmailReport跳过该消息:
docker run --rm --network="host" -v ${PWD}/reports:/app/reports \ wallarm/gotestwaf --url=<被评估的安全解决方案URL> --noEmailReport
如果被评估的安全工具可以从外部访问,您可以跳过--network="host"选项。此选项允许在127.0.0.1上运行的Docker容器之间进行交互。
要执行gRPC测试,您必须有一个可用的端点并使用--grpcPort <端口>命令行选项。
docker run --rm --network="host" -it -v ${PWD}/reports:/app/reports \ wallarm/gotestwaf --grpcPort 9000 --url=http://my.grpc.endpoint
检查您的电子邮件以获取报告。
您已成功使用最少的配置通过GoTestWAF评估了您的应用安全解决方案。要了解高级配置选项,请使用此链接。
检查使用STDOUT和STDERR服务记录的评估结果。例如:
INFO[0000] GoTestWAF 已启动 版本=v0.4.11-1-g8ccc316
INFO[0000] 开始加载测试用例
INFO[0000] 测试用例加载完成
INFO[0000] 测试用例指纹 指纹=23c3ae919db5e6edcb62815de1a09fdf
INFO[0000] 尝试识别 WAF 解决方案
INFO[0000] 未识别出 WAF
INFO[0000] WAF 预检查 URL="http://localhost:8080"
INFO[0000] WAF 预检查 已拦截=true 状态码=403 状态=完成
INFO[0000] WebSocket 预检查 状态=已开始 URL="ws://localhost:8080"
INFO[0000] WebSocket 预检查 连接="不可用" 错误="websocket: 握手失败" 状态=完成
INFO[0000] gRPC 预检查 状态=已开始
INFO[0000] gRPC 预检查 连接="不可用" 状态=完成
INFO[0000] 开始扫描 URL="http://localhost:8080"
INFO[0025] 扫描完成 持续时间=25.043996212秒
真阳性测试:
+-----------------------+-------------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
| 测试集合 | 测试用例 | 百分比, % | 已拦截 | 已绕过 | 未解决 | 已发送 | 失败 |
+-----------------------+-------------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
| community | community-128kb-rce | 0.00 | 0 | 0 | 1 | 1 | 0 |
| community | community-128kb-sqli | 0.00 | 0 | 0 | 1 | 1 | 0 |
| community | community-128kb-xss | 0.00 | 0 | 0 | 1 | 1 | 0 |
| community | community-16kb-rce | 100.00 | 1 | 0 | 0 | 1 | 0 |
| community | community-16kb-sqli | 100.00 | 1 | 0 | 0 | 1 | 0 |
| community | community-16kb-xss | 100.00 | 1 | 0 | 0 | 1 | 0 |
| community | community-32kb-rce | 100.00 | 1 | 0 | 0 | 1 | 0 |
| community | community-32kb-sqli | 100.00 | 1 | 0 | 0 | 1 | 0 |
| community | community-32kb-xss | 100.00 | 1 | 0 | 0 | 1 | 0 |
| community | community-64kb-rce | 100.00 | 1 | 0 | 0 | 1 | 0 |
| community | community-64kb-sqli | 100.00 | 1 | 0 | 0 | 1 | 0 |
| community | community-64kb-xss | 100.00 | 1 | 0 | 0 | 1 | 0 |
| community | community-8kb-rce | 100.00 | 1 | 0 | 0 | 1 | 0 |
| community | community-8kb-sqli | 100.00 | 1 | 0 | 0 | 1 | 0 |
| community | community-8kb-xss | 100.00 | 1 | 0 | 0 | 1 | 0 |
| community | community-lfi | 100.00 | 8 | 0 | 0 | 8 | 0 |
| community | community-lfi-multipart | 0.00 | 0 | 0 | 9 | 9 | 0 |
| community | community-rce | 83.33 | 10 | 2 | 0 | 12 | 0 |
| community | community-sqli | 100.00 | 32 | 0 | 0 | 32 | 0 |
| community | community-user-agent | 70.00 | 7 | 3 | 0 | 10 | 0 |
| community | community-xss | 95.80 | 502 | 22 | 0 | 524 | 0 |
| community | community-xxe | 0.00 | 0 | 2 | 0 | 2 | 0 |
| owasp | crlf | 77.78 | 7 | 2 | 0 | 9 | 0 |
| owasp | ldap-injection | 3.13 | 2 | 62 | 0 | 64 | 0 |
| owasp | mail-injection | 12.50 | 3 | 21 | 0 | 24 | 0 |
| owasp | nosql-injection | 0.00 | 0 | 70 | 0 | 70 | 0 |
| owasp | path-traversal | 24.77 | 27 | 82 | 1 | 110 | 0 |
| owasp | rce | 33.33 | 22 | 44 | 0 | 66 | 0 |
| owasp | rce-urlparam | 33.33 | 3 | 6 | 0 | 9 | 0 |
| owasp | shell-injection | 27.08 | 13 | 35 | 0 | 48 | 0 |
| owasp | sql-injection | 24.36 | 38 | 118 | 0 | 156 | 0 |
| owasp | ss-include | 37.50 | 15 | 25 | 0 | 40 | 0 |
| owasp | sst-injection | 18.75 | 12 | 52 | 0 | 64 | 0 |
| owasp | xml-injection | 0.00 | 0 | 12 | 1 | 13 | 0 |
| owasp | xss-scripting | 33.20 | 167 | 336 | 1 | 504 | 0 |
| owasp-api | graphql | 0.00 | 0 | 6 | 0 | 6 | 0 |
| owasp-api | graphql-post | 50.00 | 2 | 2 | 0 | 4 | 0 |
| owasp-api | grpc | 0.00 | 0 | 0 | 0 | 0 | 0 |
| owasp-api | non-crud | 100.00 | 2 | 0 | 0 | 2 | 0 |
| owasp-api | rest | 23.08 | 3 | 10 | 0 | 13 | 0 |
| owasp-api | soap | 23.08 | 3 | 10 | 0 | 13 | 0 |
+-----------------------+-------------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
| 日期: | 项目名称: | 真阳性得分: | 已拦截 (已解决): | 已绕过 (已解决): | 未解决 (已发送): | 总发送数: | 失败 (总数): |
| 2024-02-08 | GENERIC | 49.12% | 890/1812 (49.12%) | 922/1812 (50.88%) | 15/1827 (0.82%) | 1827 | 0/1827 (0.00%) |
+-----------------------+-------------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
真阴性测试: +-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+ | 测试集 | 测试用例 | 百分比, % | 阻止 | 绕过 | 未解决 | 发送 | 失败 | +-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+ | 误报 | 文本 | 85.65 | 31 | 185 | 0 | 216 | 0 | +-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+ | 日期: | 项目名称: | 真阴性得分: | 阻止 (已解决): | 绕过 (已解决): | 未解决 (已发送): | 总发送数: | 失败 (总计): | | 2024-02-08 | 通用 | 85.65% | 31/216 (14.35%) | 185/216 (85.65%) | 0/216 (0.00%) | 216 | 0/216 (0.00%) | +-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
总结: +-----------------------------+-----------------------------+-----------------------------+-----------------------------+ | 类型 | 真阳性测试被阻止 | 真阴性测试通过 | 平均 | +-----------------------------+-----------------------------+-----------------------------+-----------------------------+ | API安全 | 26.32% | 不适用 | 26.32% | | 应用安全 | 49.61% | 85.65% | 67.63% | +-----------------------------+-----------------------------+-----------------------------+-----------------------------+ | 得分 | 46.97% | +-----------------------------+-----------------------------+-----------------------------+-----------------------------+
报告文件 waf-evaluation-report-<日期>.pdf 可在用户目录的 reports 文件夹中找到。你也可以使用 reportPath 参数指定保存报告的目录,使用 reportName 参数指定报告文件的名称。要了解高级配置选项,请使用此链接。
选项:
--addDebugHeader 在每个请求中添加包含测试信息哈希的头部
--addHeader string 添加到请求中的HTTP头部
--blockConnReset 如果为true,连接重置将被视为阻塞
--blockRegex string 用于检测具有与未阻塞请求相同HTTP响应状态码的阻塞页面的正则表达式
--blockStatusCodes ints WAF在阻塞请求时使用的HTTP状态码(默认为[403])
--configPath string 配置文件路径(默认为"config.yaml")
--email string 报告将发送到的电子邮件地址
--followCookies 如果为true,使用服务器发送的cookies。可能只在--maxIdleConns=1时生效(仅适用于gohttp)
--graphqlURL string 要检查的GraphQL URL
--grpcPort uint16 要检查的gRPC端口
--httpClient string 用于发送请求的HTTP客户端:chrome或gohttp(默认为"gohttp")
--idleConnTimeout int 保持连接存活的最长时间(仅适用于gohttp)(默认为2)
--ignoreUnresolved 如果为true,未解决的测试用例将被视为已绕过(影响得分和结果)
--includePayloads 如果为true,有效载荷将包含在HTML/PDF报告中
--logFormat string 设置日志格式:text或json(默认为"text")
--logLevel string 日志级别:panic、fatal、error、warn、info、debug、trace(默认为"info")
--maxIdleConns int 最大保持连接数(仅适用于gohttp)(默认为2)
--maxRedirects int 处理重定向的最大次数(仅适用于gohttp)(默认为50)
--noEmailReport 本地保存报告
--nonBlockedAsPassed 如果为true,将未被阻塞的请求计为通过。如果为false,不满足PassStatusCodes/PassRegExp的请求将被视为阻塞
--openapiFile string OpenAPI文件路径
--passRegex string 用于检测具有与阻塞请求相同HTTP状态码的正常(未阻塞)网页的正则表达式
--passStatusCodes ints WAF在通过请求时使用的HTTP响应状态码(默认为[200,404])
--proxy string 要使用的代理URL
--quiet 如果为true,禁用详细日志记录
--randomDelay int 除请求之间的延迟外的随机延迟(毫秒)(默认为400)
--renewSession 每次测试前更新cookies。应与--followCookies标志一起使用(仅适用于gohttp)
--reportFormat string 将报告导出为以下格式之一:none、pdf、html、json(默认为"pdf")
--reportName string 报告文件名。支持time包模板格式(默认为"waf-evaluation-report-2006-January-02-15-04-05")
--reportPath string 存储报告的目录(默认为"reports")
--sendDelay int 请求之间的延迟(毫秒)(默认为400)
--skipWAFBlockCheck 如果为true,将跳过WAF检测测试
--skipWAFIdentification 跳过WAF识别
--testCase string 如果设置,则仅运行此测试用例
--testCasesPath string 测试用例文件夹路径(默认为"testcases")
--testSet string 如果设置,则仅运行此测试集的用例
--tlsVerify 如果为true,将验证接收到的TLS证书
--url string 要检查的URL
--version 显示GoTestWAF版本并退出
--wafName string WAF产品名称(默认为"generic")
--workers int 扫描的工作线程数(默认为5)
GoTestWAF支持两种HTTP客户端来执行请求,可通过--httpClient选项选择。默认客户端是标准Golang HTTP客户端。第二个选项是Chrome,可以使用--httpClient=chromeCLI参数来使用。请注意,在Linux系统上,必须在Docker参数中添加--cap-add=SYS_ADMIN参数才能使用Chrome作为请求执行器运行GoTestWAF。
使用reportName选项,您可以为GoTestWAF报告设置自己的文件名。此选项支持golang的time包用于时间戳。详细信息可以在此处找到。您可以使用以下占位符将时间戳添加到报告名称中:
2006、06Jan、JanuaryMon、Monday2、_2、02__2、00215、3、03(PM或AM)4、045、05PMZ0700 = Z或±hhmm,Z07:00 = Z或±hh:mm,Z07 = Z或±hh例如,默认的reportName是waf-evaluation-report-2006-January-02-15-04-05,其中2006将被替换为实际年份,January替换为月份,02替换为日期,15替换为小时,04替换为分钟,05替换为秒。
为了更好地进行扫描,GTW支持通过有效的应用程序请求发送恶意向量。GoTestWAF不是构造结构简单的请求并将其发送到启动时指定的URL,而是基于OpenAPI 3.0格式的应用程序API描述创建有效请求。
工作原理:
GoTestWAF加载OpenAPI文件并构造请求模板。然后根据它们支持的占位符(例如,如果请求路径中有一个字符串参数,则该请求将被分配到支持URLPath占位符的请求组)将所有模板分成组。
从队列中选择下一个要发送的恶意向量。根据为其指定的占位符,选择可以替换此向量的所有查询模板。接下来,将向量替换到模板中并发送请求。
根据OpenAPI文件中指定的可能响应,确定请求是被WAF阻止还是传递给应用程序。如果响应代码的状态及其方案与OpenAPI文件中描述的匹配,则请求被标记为已绕过。否则,它将被标记为已阻止。可能应用程序只响应状态代码,并且此状态代码与WAF的响应匹配。在这种情况下,请求将被标记为未解决。
支持的一些OpenAPI功能:
请求的头部、路径、查询参数和正文中的数字和字符串参数;
支持以下请求正文的内容类型:application/json、application/xml、application/x-www-form-urlencoded、text/plain;
支持XML的以下修饰符:name、wrapped、attribute、prefix、namespace;
通过minLength和maxLength参数支持字符串的长度限制;
通过minimum、maximum、exclusiveMinimum和exclusiveMaximum支持数字的值限制;
通过minItems和maxItems支持数组长度的限制;
支持通过oneOf、anyOf、allOf组合方案。
基于所描述的操作原理,OpenAPI文件正确表示已实现的应用程序API极其重要。因此,例如,您不能使用default来描述查询的可能响应。
注意:您需要将包含openapi规范的卷转发到GoTestWAF容器。
-v ${PWD}/api.yaml:/app/api.yaml
完整的Docker示例:
docker run --rm --network="host" -it -v ${PWD}/reports:/app/reports -v ${PWD}/api.yaml:/app/api.yaml wallarm/gotestwaf --wafName your_waf_name --url=https://example.com/v1 --openapiFile api.yaml
GoTestWAF允许轻松集成其他测试套件。
在这个例子中,我们将演示如何添加来自OWASP核心规则集回归测试套件的测试。
由于测试是以不同于GoTestWAF格式的格式编写的,因此需要进行转换。为此,提供了脚本misc/modsec_regression_testset_converter.rb。
要转换测试,请运行make modsec_crs_regression_tests_convert。
然后,使用更新后的测试集构建容器。
make gotestwaf
请注意,默认情况下,仅转换一部分规则的测试。选择了以下类别:
如果需要,可以修改misc/modsec_regression_testset_converter.rb中的变量"crs_testcases"以添加或删除测试类别。


职场AI,就用扣子
AI办公助手,复杂任务高效处理。办公效率低?扣 子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!


多风格AI绘画神器
堆友平台由阿里巴巴设计团队创建,作为一款AI驱动的设计工具,专为设计师提供一站式增长服务。功能覆盖海量3D素材、AI绘画、实时渲染以及专业抠图,显著提升设计品质和效率。平台不仅提供工具,还是一个促进创意交流和个人发展的空间,界面友好,适合所有级别的设计师和创意工作者。


零代码AI应用开发平台
零代码AI应用开发平台,用户只需一句话简单描述需求,AI能自动生成小程序、APP或H5网页应用,无需编写代码。


免费创建高清无水印Sora视频
Vora是一个免费创建高清无水印Sora视频的AI工具


最适合小白的AI自动化工作流平台
无需编码,轻松生成可复用、可变现的AI自动化工作流

大模型驱动的Excel数据处理工具
基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。


AI辅助编程,代码自动修复
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想 工具。


AI论文写作指导平台
AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的 整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。


AI一键生成PPT,就用博思AIPPT!
博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。


AI赋能电商视觉革命,一站式智能商拍平台
潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。
最新AI工具、AI资讯
独家AI资源、AI项目落地

微信扫一扫关注公众号