Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
为什么 AWS WAF 会阻止我的合法上传请求?
我想要上传 (POST) 一个扩展名被 AWS WAF 阻止的文件。
简短描述
AWS WAF 可能会出于以下原因之一阻止 POST 请求:
- 您的文件大于 AWS WAF 可以检查的最大请求正文大小。AWS WAF 有固定的正文检查大小配额。
- SQL 注入和跨站脚本攻击 (XSS) 规则易受元数据中包含随机字符的文件影响。这些随机字符可能会调用 Web 访问控制列表 (Web ACL) 规则。这是因为它们与 AWS WAF 中的实际的 XSS 或 SQL 注入签名相似。
首先,查看可能阻止文件上传的常见规则。如果通用规则不会阻止上传,请考虑使用其他选项以允许被阻止的文件。
通常,以下规则会阻止文件上传:
- SQLi_BODY
- CrossSiteScripting_BODY
- WindowsShellCommands_BODY
- GenericLFI_BODY
- SizeRestrictions_BODY
解决方法
文件上传被 SQLi_BODY and 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 地址添加到安全列表规则中。
使用带有匹配条件的安全列表
使用带有字符串或正则表达式 (regex) 匹配条件的安全列表来允许请求。根据 URI、HTTP 标头或与 AWS WAF 文件正文关联的短语创建安全列表。
使用安全列表中的唯一标识符来识别可被视为合法的请求。
要创建安全列表,请创建新的自定义规则。此规则在出现异常条件时会阻止 XSS 或 SQLi 向量。该条件基于上传的有效请求属性的匹配数据。覆盖托管规则组内导致误报的特定规则的操作。对于这些,将 SQLi_BODY 和 CrossSiteScripting_BODY 设置为 Count(计数)。
要创建此自定义规则,请完成以下步骤:
- 打开 AWS WAF 控制台。
- 在导航窗格中,选择 AWS WAF。
- 选择 Resources & protection packs(资源和保护包)。
- 找到您的保护包,然后选择 Rules(规则)旁边的 View and edit(查看和编辑)。
- 在右侧窗格中,选择 Add rules(添加规则)。
选择 Custom rule(自定义规则),然后单击 Next(下一步)。
再次选择 Custom rule(自定义规则),然后单击 Next(下一步)。 - 将规则 Action(操作)更新为 BLOCK(阻止)。
- 输入您的 Rule name(规则名称)。
- 对于 If a request(如果请求),展开下拉列表并选择 matches all the statements (AND)(匹配所有语句 (AND))。
- 对于 Statement 1(语句 1),完成以下步骤:
对于 Inspect(检查),选择 Has a label(有标签)。
对于 Statement(语句),选择 Label(标签)。
对于 Match key(匹配密钥),输入创建误报规则的标签。例如,如果 CrossSiteScripting_BODY 规则创建了误报,请输入 awswaf:managed:aws:core-rule-set:CrossSiteScripting_Body。 - 对于 Statement 2(语句 2),完成以下步骤:对于 Inspect(检查),选择 Body(正文)。
对于 Statement(语句),选择 Oversize Handling(超大处理)以继续。
对于 Match type(匹配类型),请选择 Contains string(包含字符串)。
对于 String to match(要匹配的字符串),输入要与规则匹配的值。
(可选)对于 Text transformation(文本转换),选择文本转换或选择 None(无)。
展开 Rule configuration(规则配置),在 Negate statement (NOT)(否定语句 (NOT))下,选择 Negate statement results(否定语句结果)。 - 选择 Create rule(创建规则)。
- 要设置规则优先级,请在右侧窗格中选择 Edit Rule Order(编辑规则顺序),然后将此规则拖到阻止请求的托管规则组下方。这会首先为规则组的检查设置托管规则标签。然后,AWS WAF 在下一个规则优先级内使用该标签。
- 选择 Save Rule Order(保存规则顺序)。
**注意:**最佳做法是将 Action(操作)设置为 Count(计数),在非生产环境中测试规则。要评估规则,请结合使用 Amazon CloudWatch 指标与 AWS WAF 采样请求或 AWS WAF 日志。如果规则如期运行,请将 Action(操作)更改为 Block(阻止)。
文件上传被 WindowsShellCommands_BODY、GenericLFI_BODY 或 SizeRestrictions_BODY 规则阻止
上传文件时创建 HTTP 归档 (HAR) 文件。然后,查看是否符合 WindowsShellCommands_BODY、GenericLFI_BODY 或 SizeRestrictions_BODY 规则。
要允许 WindowsShellCommands_BODY、GenericLFI_BODY 或 SizeRestrictions_BODY 规则出现误报,请先将阻止规则设置为 Count(计数)。有关说明,请参阅将规则组的评估结果覆盖为 Count。
然后,为导致误报的托管规则创建自定义规则:
- 打开 AWS WAF 控制台。
- 在导航窗格中,选择 AWS WAF。
- 选择 Resources & protection packs(资源和保护包)。
- 找到您的保护包,然后选择 Rules(规则)旁边的 View and edit(查看和编辑)。
- 在右侧窗格中,选择 Add rules(添加规则)。
选择 Custom rule(自定义规则),然后单击 Next(下一步)。
再次选择 Custom rule(自定义规则),然后单击 Next(下一步)。 - 将规则 Action(操作)更新为 BLOCK(阻止)。
- 输入您的 Rule name(规则名称)。
- 对于 If a request(如果请求),展开下拉列表并选择 matches all the statements (AND)(匹配所有语句 (AND))。
- 对于 Statement 1(语句 1),完成以下步骤:
对于 Inspect(检查),选择 Has a label(有标签)。
对于 Statement(语句),选择 Label(标签)。
对于 Match key(匹配密钥),输入创建误报规则的标签。例如,如果 WindowsShellCommands_BODY 规则创建了误报,请输入 awswaf:managed:aws:windows-os:WindowsShellCommands_Body。 - 对于 Statement 2(语句 2),完成以下步骤:
对于 Inspect(检查),选择 URI path(URI 路径)。在 Statement(语句)下,对于 Match type(匹配类型),选择 Exactly matches string(完全匹配字符串)。
对于 String to match(要匹配的字符串),输入当前发出请求的 URI 路径。
(可选)对于 Text transformation(文本转换),选择文本转换或选择 None(无)。
展开 Rule configuration(规则配置),在 Negate statement (NOT)(否定语句 (NOT))下,选择 Negate statement results(否定语句结果)。 - 选择 Create rule(创建规则)。
- 要设置规则优先级,请在右侧窗格中选择 Edit Rule Order(编辑规则顺序),然后将此规则拖到阻止请求的托管规则组下方。
- 选择 Save Rule Order(保存规则顺序)。
**注意:**最佳做法是将 Action(操作)设置为 Count(计数),在非生产环境中测试规则。要评估规则,请结合使用 CloudWatch 指标与 AWS WAF 采样请求或 AWS WAF 日志。如果规则如期运行,请将 Action(操作)更改为 Block(阻止)。
其他允许被阻止文件的方案
**注意:**规则按其列出的顺序进行处理。对于以下最佳实践,请根据需要对规则优先级进行重新排序。
选择适合使用案例的最佳方法:
- 使用 AWS WAF 字符串匹配规则语句或 AWS WAF Classic 字符串匹配条件应用选择性排除。将与文件正文关联的特定短语添加到安全列表中。例如: 如果特定 URI 路径出现误报,请将该路径添加到安全列表中。
- 使用单独的域进行文件上传。验证这是否是您的使用案例中具有成本效益的选项。
- 扫描(清除)文件和图像中的嵌入式代码和数据。您可以先在客户端执行此操作,然后再上传文件。或者,如果您创建了排除规则,则可以在上传文件后在后端执行此操作。
- 在上传文件之前先压缩文件。
**注意:**确保未压缩恶意文件。 - 如果从一系列已知 IP 地址进行上传,请将这些 IP 地址添加到您的安全列表中。
- 使用 base64 编码对所有图像数据进行编码,这样 AWS WAF 就不会在图像上调用 XSS 或 SQLi。
**注意:**确保避免对恶意图像进行编码。 - 实施图像优化技术,例如区块移除或位随机掩码。
