如何上传被 AWS WAF 阻止的文件?

2 分钟阅读
0

我需要上传(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_BODYCrossSiteScripting_BODY 攻击时,才会填充 terminatingRuleMatchDetails 字段。

以下是 CrossSiteScripting_BODYmatchedData 示例:

"terminatingRuleMatchDetails": [{
        "conditionType": "XSS",
        "location": "BODY",
        "matchedData": [
            "<?",
            "`"
        ]

以下是 SQLi_BODYmatchedData 示例:

"terminatingRuleMatchDetails": [{
        "conditionType": "SQL_INJECTION",
        "location": "BODY",
        "matchedData": [
            ")",
            "*",
            "(",
            "0"
        ]

要解决 SQLi_BODYCrossSiteScripting_BODY 阻止上传的问题,请选择以下任一方案:

将已知 IP 地址添加到安全列表
如果知道访问应用程序的 IP 地址范围,请将已知的 IP 地址添加到具有 IP 匹配条件的安全列表规则中。有关说明,请参阅使用 IP 匹配条件

使用带有匹配条件的安全列表
使用带有字符串或正则表达式(regex)匹配条件的安全列表来允许请求。可以根据 URI、HTTP 标头或与 AWS WAF 文件正文关联的短语创建安全列表。

要创建安全列表,请创建新的自定义规则。此规则会阻止 XSS 或 SQLi 向量,但存在例外条件,该条件基于用于上传的有效请求属性的匹配数据。请务必覆盖托管规则组内导致误报的特定规则的操作SQLi_BODYCrossSiteScripting_BODY

要创建此自定义规则,请完成以下步骤:

  1. 打开 AWS WAF 控制台
  2. 在导航窗格中的 AWS WAF 下,选择 Web ACL
  3. 对于区域,选择已创建 Web ACL 的 AWS 区域。
    注意:如果为 Amazon CloudFront 设置了 Web ACL,请选择全球
  4. 选择您的 Web ACL。然后,在 Web ACL 规则选项卡中,选择规则
  5. 选择添加规则,然后选择添加我自己的规则和规则组
  6. 对于名称,输入规则名称,然后选择常规规则
  7. 对于如果是请求,选择匹配所有语句(AND)
  8. 使用以下字段填写语句 1
    对于检查,选择有标签
    对于匹配范围,选择标签
    对于匹配密钥,请输入创建误报规则的标签。例如,如果 CrossSiteScripting_BODY 规则创建了误报,则输入 awswaf:managed:aws:core-rule-set:CrossSiteScripting_Body
  9. 使用以下字段填写语句 2
    选中否定语句结果的复选框。
    对于检查,选择正文
    对于匹配类型,选择包含字符串
    对于要匹配的字符串,输入要与规则匹配的值。
  10. (可选)对于文本转换,选择文本转换
  11. 对于操作,选择阻止。然后,选择添加规则
  12. 对于设置规则优先级,将规则移至阻止请求的托管规则组之下。此操作会首先为规则组的检查设置托管规则标签,然后 AWS WAF 会在下一个规则优先级内使用该标签。
  13. 选择保存

重要说明:最佳做法是将操作设置为计数,然后在非生产环境中测试规则。要评估规则,请结合使用 Amazon CloudWatch 指标与 AWS WAF 采样请求或 AWS WAF 日志。如果规则执行了您想要的操作,请将操作更改为阻止

文件上传被 WindowsShellCommands_BODY、GenericLFI_BODY 或 SizeRestrictions_BODY 规则阻止

上传文件时获取 HTTP 存档(HAR)文件。然后,查看是否符合 WindowsShellCommands_BODYGenericLFI_BODYSizeRestrictions_BODY 规则。有关说明,请参阅如何从浏览器为 AWS Support 案例创建 HAR 文件?

要允许 WindowsShellCommands_BODYGenericLFI_BODYSizeRestrictions_BODY 规则出现误报,请先将相应规则设置为计数模式。有关说明,请参阅将规则组的评估结果改写为“计数”

然后,为导致误报的特定托管规则创建自定义规则:

  1. 打开 AWS WAF 控制台
  2. 在导航窗格中的 AWS WAF 下,选择 Web ACL
  3. 对于区域,选择已创建 Web ACL 的 AWS 区域。
    注意:如果为 Amazon CloudFront 设置了 Web ACL,请选择全球
  4. 选择您的 Web ACL。然后,在 Web ACL 规则选项卡中,选择规则
  5. 选择添加规则,然后选择添加我自己的规则和规则组
  6. 对于名称,输入规则名称,然后选择常规规则
  7. 对于如果是请求,选择匹配所有语句(AND)
  8. 使用以下字段填写语句 1
    对于检查,选择有标签
    对于匹配范围,选择标签
    对于匹配密钥,请输入创建误报规则的标签。例如,如果 WindowsShellCommands_BODY 规则创建了误报,则输入 awswaf:managed:aws:windows-os:WindowsShellCommands_Body
  9. 使用以下字段填写语句 2
    选中否定语句结果的复选框。
    对于检查,选择 URI 路径
    对于匹配类型,选择完全匹配字符串
    对于要匹配的字符串,输入发出请求的 URI 路径。
  10. (可选)对于文本转换,选择文本转换
  11. 对于操作,选择阻止
  12. 选择添加规则
  13. 对于设置规则优先级,将规则移至阻止请求的托管规则之下。
  14. 选择保存

重要说明:最佳做法是将操作设置为计数,然后在非生产环境中测试规则。请结合使用 Amazon CloudWatch 指标与 AWS WAF 采样请求或 AWS WAF 日志,以评估规则。如果规则执行了您想要的操作,请将操作更改为阻止

其他允许被阻止文件的方案

**注意:**规则的处理顺序与其在 Web ACL 中的列表顺序相同。对于以下建议,请务必根据需要对规则优先级进行重新排序。
选择适合用例的最佳方法:

  • 使用字符串匹配规则语句(AWS WAF)或字符串匹配条件(AWS WAF Classic)应用选择性排除。将与文件正文关联的特定短语添加到安全列表中。如果某个 URI 路径出现误报,请将该路径添加到安全列表中。
  • 使用单独的域进行文件上传。请务必考虑此方案对于您用例的成本效益性。
  • 扫描(清除)文件和图像中的嵌入式代码和数据。您可以先在客户端执行此操作,然后再上传文件。或者,如果您创建了排除规则,则可以在上传文件后在后端执行此操作。
  • 在上传文件之前先压缩文件。
    **警告:**确保未压缩恶意文件。
  • 如果从一系列已知 IP 地址进行上传,请将这些 IP 地址添加到您的安全列表中。
  • 使用 base64 编码对所有图像数据进行编码,这样 AWS WAF 就不会在图像上调用 XSS 或 SQLi。
    **警告:**务必避免对恶意图像进行编码。
  • 实施图像优化技术,例如区块移除或位随机掩码。
AWS 官方
AWS 官方已更新 4 个月前