如何上传被 AWS WAF 阻止的文件?
我需要上传(POST)一个扩展名被 AWS WAF 阻止的文件。
简短描述
要了解 AWS WAF 为什么阻止 POST 请求,请注意以下几点:
- AWS WAF BODY 筛选器仅检查 POST 请求的负载数据的前 8192 个字节中是否有恶意脚本。
- SQL 注入和跨站脚本攻击(XSS)规则对元数据中包含随机字符的文件非常敏感。这些随机字符可能会调用 Web ACL 规则,因为它们与 AWS WAF 中实际的 XSS 或 SQL 注入签名相似。
AWS WAF 不支持筛选特定文件类型。您必须使用其他方法来消除因上传文件或图像而导致的误报。
首先,查看可能阻止文件上传的常用规则。如果常用规则没有阻止上传,请考虑使用其他选项来允许被阻止的文件。
以下规则通常会阻止文件上传:
- CrossSiteScripting_BODY
- SQLi_BODY
- WindowsShellCommands_BODY
- GenericLFI_BODY
- SizeRestrictions_BODY
解决方法
文件上传被 SQLi_BODY 和 CrossSiteScripting_BODY 规则阻止
查看 AWS WAF comprehensive logs(全面的 AWS WAF 日志)中的 terminatingRuleMatchDetails 字段,了解规则信息。
**注意:**terminatingRuleMatchDetails 字段仅针对 SQLi_BODY 和 CrossSiteScripting_BODY 攻击进行填充。
以下是 CrossSiteScripting_BODY 的 matchedData 示例:
"terminatingRuleMatchDetails": [{ "conditionType": "XSS", "location": "BODY", "matchedData": [ "<?", "`" ]
以下是 SQLi_BODY 的 matchedData 的示例:
"terminatingRuleMatchDetails": [{ "conditionType": "SQL_INJECTION", "location": "BODY", "matchedData": [ ")", "*", "(", "0" ]
要处理被 SQLi_BODY 或 CrossSiteScripting_BODY 阻止的上传,请选择以下选项之一:
选项 1
如果您知道访问应用程序的 IP 地址范围,则将已知的 IP 地址添加到具有 IP 匹配条件的安全列表规则中。有关说明,请参阅使用 IP 匹配条件。
选项 2
使用带有字符串或正则表达式(regex)匹配条件的安全列表,以允许该请求。您可以根据 URI、HTTP 标头或与 AWS WAF 上的文件正文关联的特定短语创建安全列表。
要创建安全列表,请创建一个新的自定义规则,以阻止存在基于匹配数据的异常情况的 XSS 或 SQLi 向量。务必覆盖导致误报的特定规则的操作。
要创建此自定义规则,请完成以下步骤:
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(匹配密钥),请输入创建误报的规则的标签。例如,如果 CrossSiteScripting_BODY 规则创建了误报,则输入 awswaf:managed:aws:core-rule-set:CrossSiteScripting_Body。
10. 使用以下字段填写 Statement 2(语句 2):
选中 Negate statement results(否定语句结果)的复选框。
对于 Inspect(检查),选择 Body(正文)。
对于 Match type(匹配类型),选择 Contains string(包含字符串)。
对于 String to match(要匹配的字符串),输入要与规则匹配的值。
11. (可选)对于 Text transformation(文本转换),请选择 Text transformation(文本转换)或 None(无)。
12. 对于 Action(操作),选择 Block(阻止)。
13. 选择 Add rule(添加规则)。
14. 对于 Set rule priority(设置规则优先级),将规则移到阻止请求的托管规则下方。
15. 选择 Save(保存)。
**重要提示:**最佳做法是在 Action(操作)设置为 Count(计数)的情况下在非生产环境中测试规则。使用 Amazon CloudWatch 指标与 AWS WAF 采样请求或 AWS WAF 日志相结合,评估规则。当规则执行您想要的操作时,将 Action(操作)更改为 Block(阻止)。
文件上传被 WindowsShellCommands_BODY、GenericLFI_BODY 或 SizeRestrictions_BODY 规则阻止
在上传文件时获取 HTTP Archive(HAR)文件,然后查看是否符合 WindowsShellCommands_BODY、GenericLFI_BODY 或 SizeRestrictions_BODY 规则。有关说明,请参阅如何从浏览器为 AWS Support 案例创建 HAR 文件?
要允许 WindowsShellCommands_BODY、GenericLFI_BODY 或 SizeRestrictions_BODY 出现误报,请先将相应的规则设置为 Count(计数)模式。有关说明,请参阅将规则组的评估结果覆盖为计数。
然后,使用标签为导致误报且存在异常情况的特定托管规则创建自定义规则:
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(设置规则优先级),将规则移到阻止请求的托管规则下方。
15. 选择 Save(保存)。
**重要提示:**最佳做法是在 Action(操作)设置为 Count(计数)的情况下在非生产环境中测试规则。使用 CloudWatch 指标与 AWS WAF 采样请求或 AWS WAF 日志相结合,评估规则。当规则执行您想要的操作时,将 Action(操作)更改为 Block(阻止)。
允许被阻止文件的其他选项
**注意:**规则将按照在 Web ACL 中列出的顺序进行处理。对于以下建议,请务必根据需要对规则优先级进行重新排序。
为您的使用情形选择最佳方法:
- 使用字符串匹配规则语句(AWS WAF)或字符串匹配条件(AWS WAF Classic)应用选择性排除。将与文件的正文相关联的特定短语添加到您的安全列表。如果某个 URI 路径上出现误报,则将该路径添加到您的安全列表中。
- 使用单独的域进行文件上传。请务必考虑这对于您的使用案例来说是否经济高效。
- 扫描(清理)嵌入式代码和数据的文件和图像。在上传文件之前,您可以在客户端执行此操作。如果您创建排除规则,也可以在上传文件后在后端执行此操作。
- 在上传文件之前先压缩文件。
**警告:**请确保未压缩恶意文件。 - 如果是从一系列已知 IP 地址上传,请将这些 IP 地址添加到您的安全列表。
- 使用 base64 编码对所有图像数据进行编码,这样 AWS WAF 就不会在图像上调用 XSS 或 SQLi。
**警告:**务必避免对恶意图像进行编码。 - 实施图像优化技术,例如删除区块或位随机化。
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 6 个月前