如何上传被 AWS WAF 阻止的文件?
我需要上传(POST)一个扩展名被 AWS WAF 阻止的文件。
简短描述
要了解 AWS WAF 为什么会阻止 POST 请求,请注意以下几点:
- AWS WAF _BODY 托管规则仅检查请求正文,不得超过 Web 访问控制列表(ACL)的正文大小上限。区域网络 ACL 的上限为 8 KB,Amazon CloudFront Web ACL 的上限为 16 KB。对于 CloudFront Web ACL,您可以在 Web ACL 配置中将上限放宽到 64 KB。
- SQL 注入和跨站脚本攻击(XSS)规则易受元数据中包含随机字符的文件影响。这些随机字符可能会调用 Web ACL 规则,因为它们与 AWS WAF 中的实际 XSS 或 SQL 注入签名相似。
首先,查看可能阻止文件上传的常见规则。如果通用规则不会阻止上传,则考虑使用其他选项以允许被阻止的文件。
通常,以下规则会阻止文件上传:
- CrossSiteScripting_BODY
- SQLi_BODY
- WindowsShellCommands_BODY
- GenericLFI_BODY
- SizeRestrictions_BODY
解决方法
文件上传被 SQLi_BODY 和 CrossSiteScripting_BODY 规则阻止
查看 AWS WAF 综合日志中的 terminatingRuleMatchDetails 字段,了解规则信息。
**注意:**只有针对 SQLi_BODY 和 CrossSiteScripting_BODY 攻击时,才会填充 terminatingRuleMatchDetails 字段。
以下是 CrossSiteScripting_BODY 的 matchedData 示例:
"terminatingRuleMatchDetails": [{ "conditionType": "XSS", "location": "BODY", "matchedData": [ "<?", "`" ]
以下是 SQLi_BODY 的 matchedData 示例:
"terminatingRuleMatchDetails": [{ "conditionType": "SQL_INJECTION", "location": "BODY", "matchedData": [ ")", "*", "(", "0" ]
要解决 SQLi_BODY 或 CrossSiteScripting_BODY 阻止上传的问题,请选择以下任一方案:
将已知 IP 地址添加到安全列表
如果知道访问应用程序的 IP 地址范围,请将已知的 IP 地址添加到具有 IP 匹配条件的安全列表规则中。有关说明,请参阅使用 IP 匹配条件。
使用带有匹配条件的安全列表
使用带有字符串或正则表达式(regex)匹配条件的安全列表来允许请求。可以根据 URI、HTTP 标头或与 AWS WAF 文件正文关联的短语创建安全列表。
要创建安全列表,请创建新的自定义规则。此规则会阻止 XSS 或 SQLi 向量,但存在例外条件,该条件基于用于上传的有效请求属性的匹配数据。请务必覆盖托管规则组内导致误报的特定规则的操作: SQLi_BODY 与 CrossSiteScripting_BODY。
要创建此自定义规则,请完成以下步骤:
- 打开 AWS WAF 控制台。
- 在导航窗格中的 AWS WAF 下,选择 Web ACL。
- 对于区域,选择已创建 Web ACL 的 AWS 区域。
注意:如果为 Amazon CloudFront 设置了 Web ACL,请选择全球。 - 选择您的 Web ACL。然后,在 Web ACL 规则选项卡中,选择规则。
- 选择添加规则,然后选择添加我自己的规则和规则组。
- 对于名称,输入规则名称,然后选择常规规则。
- 对于如果是请求,选择匹配所有语句(AND)。
- 使用以下字段填写语句 1:
对于检查,选择有标签。
对于匹配范围,选择标签。
对于匹配密钥,请输入创建误报规则的标签。例如,如果 CrossSiteScripting_BODY 规则创建了误报,则输入 awswaf:managed:aws:core-rule-set:CrossSiteScripting_Body。 - 使用以下字段填写语句 2:
选中否定语句结果的复选框。
对于检查,选择正文。
对于匹配类型,选择包含字符串。
对于要匹配的字符串,输入要与规则匹配的值。 - (可选)对于文本转换,选择文本转换或无。
- 对于操作,选择阻止。然后,选择添加规则。
- 对于设置规则优先级,将规则移至阻止请求的托管规则组之下。此操作会首先为规则组的检查设置托管规则标签,然后 AWS WAF 会在下一个规则优先级内使用该标签。
- 选择保存。
重要说明:最佳做法是将操作设置为计数,然后在非生产环境中测试规则。要评估规则,请结合使用 Amazon CloudWatch 指标与 AWS WAF 采样请求或 AWS WAF 日志。如果规则执行了您想要的操作,请将操作更改为阻止。
文件上传被 WindowsShellCommands_BODY、GenericLFI_BODY 或 SizeRestrictions_BODY 规则阻止
上传文件时获取 HTTP 存档(HAR)文件。然后,查看是否符合 WindowsShellCommands_BODY、GenericLFI_BODY 或 SizeRestrictions_BODY 规则。有关说明,请参阅如何从浏览器为 AWS Support 案例创建 HAR 文件?
要允许 WindowsShellCommands_BODY、GenericLFI_BODY 或 SizeRestrictions_BODY 规则出现误报,请先将相应规则设置为计数模式。有关说明,请参阅将规则组的评估结果改写为“计数”。
然后,为导致误报的特定托管规则创建自定义规则:
- 打开 AWS WAF 控制台。
- 在导航窗格中的 AWS WAF 下,选择 Web ACL。
- 对于区域,选择已创建 Web ACL 的 AWS 区域。
注意:如果为 Amazon CloudFront 设置了 Web ACL,请选择全球。 - 选择您的 Web ACL。然后,在 Web ACL 规则选项卡中,选择规则。
- 选择添加规则,然后选择添加我自己的规则和规则组。
- 对于名称,输入规则名称,然后选择常规规则。
- 对于如果是请求,选择匹配所有语句(AND)。
- 使用以下字段填写语句 1:
对于检查,选择有标签。
对于匹配范围,选择标签。
对于匹配密钥,请输入创建误报规则的标签。例如,如果 WindowsShellCommands_BODY 规则创建了误报,则输入 awswaf:managed:aws:windows-os:WindowsShellCommands_Body。 - 使用以下字段填写语句 2:
选中否定语句结果的复选框。
对于检查,选择 URI 路径。
对于匹配类型,选择完全匹配字符串。
对于要匹配的字符串,输入发出请求的 URI 路径。 - (可选)对于文本转换,选择文本转换或无。
- 对于操作,选择阻止。
- 选择添加规则。
- 对于设置规则优先级,将规则移至阻止请求的托管规则之下。
- 选择保存。
重要说明:最佳做法是将操作设置为计数,然后在非生产环境中测试规则。请结合使用 Amazon CloudWatch 指标与 AWS WAF 采样请求或 AWS WAF 日志,以评估规则。如果规则执行了您想要的操作,请将操作更改为阻止。
其他允许被阻止文件的方案
**注意:**规则的处理顺序与其在 Web ACL 中的列表顺序相同。对于以下建议,请务必根据需要对规则优先级进行重新排序。
选择适合用例的最佳方法:
- 使用字符串匹配规则语句(AWS WAF)或字符串匹配条件(AWS WAF Classic)应用选择性排除。将与文件正文关联的特定短语添加到安全列表中。如果某个 URI 路径出现误报,请将该路径添加到安全列表中。
- 使用单独的域进行文件上传。请务必考虑此方案对于您用例的成本效益性。
- 扫描(清除)文件和图像中的嵌入式代码和数据。您可以先在客户端执行此操作,然后再上传文件。或者,如果您创建了排除规则,则可以在上传文件后在后端执行此操作。
- 在上传文件之前先压缩文件。
**警告:**确保未压缩恶意文件。 - 如果从一系列已知 IP 地址进行上传,请将这些 IP 地址添加到您的安全列表中。
- 使用 base64 编码对所有图像数据进行编码,这样 AWS WAF 就不会在图像上调用 XSS 或 SQLi。
**警告:**务必避免对恶意图像进行编码。 - 实施图像优化技术,例如区块移除或位随机掩码。
相关内容
- AWS 官方已更新 8 个月前
- AWS 官方已更新 8 个月前
- AWS 官方已更新 1 年前