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

上次更新日期:2022 年 7 月 27 日

我需要上传(POST)一个扩展名被 AWS WAF 阻止的文件。如何上传被 AWS WAF 阻止的文件?

简短描述

要了解 AWS WAF 为什么阻止 POST 请求,请请考虑以下内容:

  • AWS WAF BODY 筛选器仅检查 POST 请求的负载数据的前 8192 个字节中是否有恶意脚本。
  • SQLinjection 和跨站点脚本(XSS)规则对元数据中包含随机字符的文件非常敏感。这些随机字符可能会启动 Web ACL 规则,因为它们与 AWS WAF 中实际的 XSS 或 SQLinjection 签名相似。

AWS WAF 不支持筛选特定文件类型。您必须使用其他方法来消除因上传文件或图像而导致的误报。

首先,查看阻止文件上传的常用规则。如果常用规则没有阻止上传,请考虑使用其他选项来允许被阻止的文件。

以下常用规则会阻止文件上传:

  • CrossSiteScripting_BODY
  • SQLi_BODY
  • WindowsShellCommands_BODY
  • GenericLFI_BODY
  • SizeRestrictions_BODY

解决方法

文件上传被 SQLi_BODY 和 CrossSiteScripting_BODY 规则阻止

查看全面的 AWS WAF 日志中的 terminatingRuleMatchDetails 字段,了解规则信息。要打开 AWS WAF 日志记录,请参阅如何启用 AWS WAF 日志记录并将日志发送到 CloudWatch、Amazon S3 或 Kinesis Data Firehose?
注意:terminatingRuleMatchDetails 字段仅针对 SQLi_BODYCrossSiteScripting_BODY 攻击进行填充。

以下是 CrossSiteScripting_BODYmatchedData 示例:

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

以下是 SQLi_BODYmatchedData 的示例:

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

要处理被 SQLi_BODYCrossSiteScripting_BODY 阻止的上传,请选择以下选项之一:

选项 1

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

选项 2

使用带有字符串或正则表达式匹配条件的安全列表,以允许该请求。您可以根据 URI、HTTP 标头或与 AWS WAF 上的文件主体关联的特定短语创建安全列表。

要根据匹配的数据创建安全列表,请执行以下操作:

向阻止您的请求的特定 AWS 托管式规则添加范围缩小语句

  1. 打开 AWS WAF 控制台
  2. 在导航窗格中的 AWS WAF 下,选择 Web ACL
  3. 对于 Region(区域),选择您创建 Web ACL 的 AWS 区域。
    注意:如果您的 Web ACL 是为 Amazon CloudFront 设置的,请选择 Global(全球)。
  4. 选择您的 Web ACL。
  5. 在 Web ACL Rules(规则)选项卡中,选择 Rules(规则)。
  6. 选择 Add Rules(添加规则),然后选择 Add my own rules and rule groups(添加我自己的规则和规则组)。
  7. 对于 Name(名称),输入 rule name(规则名称),然后选择 Regular Rule(常规规则)。
  8. 对于 If a request(如果请求),选择 matches the statement(与语句匹配)。
  9. Statement 1(语句 1)中:
    对于 Inspect(检查),选择 Body(主体)。
    对于 Content type(内容类型),选择 Plain text(纯文本)或 JSON
    对于 Match type(匹配类型),选择 Contains string(包含字符串)。
    对于 String to match(要匹配的字符串),请输入要与规则匹配的值。
  10. (可选)对于 Text transformation(文本转换),请选择 Text transformation(文本转换)或 None(无)。
  11. 对于 Action(操作),选择 Allow(允许)。
  12. 选择 Add rule(添加规则)。
  13. 对于 Set rule priority(设置规则优先级),将规则移到阻止请求的 AWS 托管式规则下方。
  14. 选择 Save(保存)。

重要提示:最佳做法是在 Action(操作)设置为 Count(计数)的情况下在非生产环境中测试规则。使用 Amazon CloudWatch 指标与 AWS WAF 采样请求或 AWS WAF 日志相结合,评估规则。如果您对规则执行您想要的操作感到满意,请将 Action(操作)更改为 Allow(允许)。

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

在上传文件时获取 HTTP Archive(HAR)文件,然后查看是否符合 WindowsShellCommands_BODYGenericLFI_BODYSizeRestrictions_BODY 规则。有关说明,请参阅如何通过浏览器为 AWS Support 案例创建 HAR 文件?并按照在浏览器中创建 HAR 文件中的说明进行操作。

要允许 WindowsShellCommands_BODYGenericLFI_BODYSizeRestrictions_BODY 出现误报,请先将相应的规则设置为 Count(计数)模式。有关说明,请参阅在规则组中将规则操作设置为计数

然后,向阻止您的请求的特定 AWS 托管规则添加范围缩小语句

  1. 打开 AWS WAF 控制台
  2. 在导航窗格中的 AWS WAF 下,选择 Web ACL
  3. 对于 Region(区域),选择您创建 Web ACL 的 AWS 区域。
    注意:如果您的 Web ACL 是为 Amazon CloudFront 设置的,请选择 Global(全球)。
  4. 选择您的 Web ACL。
  5. 在 Web ACL Rules(规则)选项卡中,选择 Rules(规则)。
  6. 选择 Add Rules(添加规则),然后选择 Add my own rules and rule groups(添加我自己的规则和规则组)。
  7. 对于 Name(名称),输入 rule name(规则名称),然后选择 Regular Rule(常规规则)。
  8. 对于 If a request(如果请求),选择 matches all the statements (AND)(与所有语句匹配(AND))。
  9. Statement 1(语句 1)中:
    对于 Inspect(检查),选择 Has a label(有标签)。
    对于 Match scope(匹配范围),选择 Label(标签)。
    对于 Match key(匹配密钥),输入创建误报的规则的标签。例如,如果 WindowsShellCommands_BODY 规则正在创建误报,请输入 awswaf:managed:aws:windows-os:WindowsShellCommands_Body
  10. Statement 2(语句 2)中:
    选择 Negate statement results(否定语句结果)。
    对于 Inspect(检查),选择 URI path(URI 路径)。
    对于 Match type(匹配类型),选择 Exactly matches string(完全匹配字符串)。
    对于 String to match(要匹配的字符串),请输入发出请求的 URI 路径。
  11. (可选)对于 Text transformation(文本转换),请选择 Text transformation(文本转换)或 None(无)。
  12. 对于 Action(操作),选择 Block(阻止)。
  13. 选择 Add rule(添加规则)。
  14. 对于 Set rule priority(设置规则优先级),将规则移到阻止请求的 AWS 托管式规则下方。
  15. 选择 Save(保存)。

重要提示:最佳做法是在 Action(操作)设置为 Count(计数)的情况下在非生产环境中测试规则。使用 Amazon CloudWatch 指标与 AWS WAF 采样请求或 AWS WAF 日志相结合,评估规则。如果您对规则执行您想要的操作感到满意,请将 Action(操作)更改为 Block(阻止)。

允许被阻止文件的其他选项

注意:规则将按照在 Web ACL 中列出的顺序进行处理。对于以下建议,请务必根据需要对规则优先级进行重新排序。

为您的使用情形选择最佳方法:

  • 使用字符串匹配规则语句 (AWS WAF) 或字符串匹配条件 (AWS WAF Classic) 应用选择性排除。将与文件的主体相关联的特定短语添加到您的安全列表。如果 URI 有特定路径,请将该路径添加到您的安全列表。
  • 使用单独的域进行文件上传。请务必考虑这对于您的使用情形来说是否经济高效。
  • 扫描(清理)嵌入式代码和数据的文件和图像。在上传文件之前,您可以在客户端执行此操作。如果您需要创建排除规则,也可以在上传文件后在后端执行此操作。
  • 在上传文件之前先压缩文件。
    警告:请确认未压缩恶意文件。
  • 如果上传是从一系列已知 IP 地址进行的,请将这些 IP 地址添加到您的安全列表。
  • 使用 Base64 编码。所有图像数据都经过编码,这意味着 AWS WAF 无法在图像上启动 XSS。
    警告:一定要避免对恶意图像进行编码。
  • 实施图像优化技术,例如删除区块或位随机化。

这篇文章对您有帮助吗?


您是否需要账单或技术支持?