Citrix ADC

JSON 拒绝服务保护检查

JSON 拒绝服务 (DoS) 检查检查传入的 JSON 请求,并验证是否有任何数据与 DoS 攻击的特征相匹配。如果请求存在 JSON 违规,设备将阻止请求、记录数据、发送 SNMP 警报,并显示 JSON 错误页面。JSON DoS 检查的目的是防止攻击者发送 JSON 请求,以便在您的 JSON 应用程序或网站上启动 DoS 攻击。

当客户端向 Citrix ADC 设备发送请求时,JSON 解析器将解析请求负载,如果观察到冲突,设备将对 JSON 结构强制执行约束。约束对 JSON 请求强制执行大小限制。因此,如果观察到任何 JSON 违规,设备将应用操作并以 JSON 错误页面进行响应。

JSON DoS 规则

当设备收到 JSON 请求时,JSON DOS 保护会在请求负载中对以下 DoS 参数实施大小限制。

  1. 最大深度:JSON 文档的最大嵌套(深度)。此检查可防止具有过多层次结构深度的文档。
  2. 最大文档长度:JSON 文档的最大文档长度。
  3. 最大数组长度:任何 JSON 对象中的最大数组长度。此检查可防止具有较大长度的阵列。
  4. 最大字符串长度:JSON 中的最大字符串长度。此检查可防止长度较大的字符串。
  5. 最大对象键计数:任何 JSON 对象中的最大键计数。此检查可防止具有大量密钥的对象。
  6. 最大对象密钥长度:任何 JSON 对象中的最大密钥长度。此检查可防止具有大键的对象。

以下是在 JSON 解析期间验证的 JSON DoS 规则的列表。

  1. JSONMaxContainerDepth。此检查可以通过配置 JSONMaxContainerDepth 检查来启用,默认情况下选项为 OFF。

  2. JSONMaxContainerDepth。此检查可以通过可配置选项 JSONMaxContainerDepthCheck 启用/禁用,默认值可以通过选项 JSONMaxContainerDepth 进行更改。但是,您可以将最大级别更改为介于 1 到 127 之间的值。默认值:5,最小值:1,最大值:127

  3. JSONMaxDocumentLength。可以通过配置 JSONMaxDocumentLength 检查来启用此检查,并且默认选项为 OFF。

  4. JSONMaxDocumentLength。此检查可以通过配置 JSONMaxDocumentLength 检查来启用,并且默认长度设置为 20000000 字节。最小值:1, 最大值:2147483647

  5. JSONMaxObjectKeyCount。该规则将验证 JSON 最大对象键计数检查是否已打开或关闭。可能的值:ON、OFF 默认值:OFF

  6. JSONMaxObjectKeyCount。可以通过配置 JSONMaxObjectKeyCount 检查来启用此检查。检查可防止具有大量键的对象,并且默认值设置为 1000 字节。最小值:0,最大值:2147483647

  7. JSONMaxObjectKeyLength。可以通过配置 JSONMaxObjectKeyLength 检查来启用此检查。该规则将验证 JSON 最大对象密钥长度检查是否已打开或关闭。默认情况下,它处于关闭状态。

  8. JSONMaxObjectKeyLength。此检查可防止具有较大密钥长度的对象。默认值:128。最小值:1, 最大值:2147483647

  9. JSONMaxArrayLength。该规则将验证 JSON 最大阵列长度检查是打开还是关闭。默认情况下,它处于关闭状态。

  10. JSONMaxArrayLength。该检查可防止长度较大的阵列。默认情况下,该值设置为 10000。最小值:1, 最大值:2147483647

  11. JSONMaxStringLength。可以通过配置 JSONMaxStringLength 检查来启用此检查。该检查将验证 JSON 最大字符串长度是开还是关闭。默认情况下,它处于关闭状态。

  12. JSONMaxStringLength。该检查可防止长度较大的字符串。默认情况下,它被设置为 1000000。最小值:1, 最大值:2147483647

配置 JSON DoS 防护检查

要配置 JSON DoS 防护,必须完成以下步骤:

  1. 为 JSON 添加应用程序防火墙配置文件。
  2. 为 JSON DoS 设置设置应用程序防火墙配置文件。
  3. 通过绑定应用程序防火墙配置文件来配置 JSON DoS 变量。

为 JSON DoS 保护添加应用程序防火墙配置文

您必须首先创建一个配置文件,该配置文件指定应用程序防火墙必须如何保护 JSON Web 内容免受 JSON DoS 攻击。 在命令提示窗口中,键入:

add appfw profile <name> -type (HTML | XML | JSON)

注意

将配置文件类型设置为 JSON 时,HTML 或 XML 等其他检查将不适用。

示例

add appfw profile profile1 –type JSON

为 JSON DoS 防护设置应用程序防火墙配置文

您必须为要在应用程序防火墙配置文件上设置的一个或多个 JSON DoS 操作和 JSON DoS 错误对象配置文件。 在命令提示窗口中,键入:

set appfw profile <name> -JSONDoSAction [block] | [log] | [stats] | [none]

Block-阻止冲突此安全检查的连接。 日志-记录此安全检查的冲突情况。 统计数据-为此安全检查生成统计数据。 无-禁用此安全检查的所有操作。

注意

要启用一个或多个操作,请键入“set appfw profile -JSONDoSAction”,然后键入要启用的操作。

示例

set appfw profile profile1 -JSONDoSAction block log stat

通过绑定应用防火墙配置文件来配置 DoS

要提供 JSON DoS 防护,必须将应用程序防火墙配置文件与 JSON DoS 设置绑定。 在命令提示窗口中,键入:

bind appfw profile <name> -JSONDoSURL <expression> [-JSONMaxContainerDepthCheck ( ON | OFF ) [-JSONMaxContainerDepth <positive_integer>]] [-JSONMaxDocumentLengthCheck ( ON | OFF ) [-JSONMaxDocumentLength <positive_integer>]] [-JSONMaxObjectKeyCountCheck ( ON | OFF ) [-SONMaxObjectKeyCount <positive_integer>]] [-JSONMaxObjectKeyLengthCheck ( ON | OFF ) [-JSONMaxObjectKeyLength <positive_integer>]] [-JSONMaxArrayLengthCheck ( ON | OFF ) [-JSONMaxArrayLength <positive_integer>]] [-JSONMaxStringLengthCheck ( ON | OFF ) [-JSONMaxStringLength <positive_integer>]]

示例

bind appfw profile profile1 -JSONDoSURL “.*” -JSONMaxContainerDepthCheck ON

注意

仅当配置文件类型被选为 JSON 时,JSON DoS 检查才适用。此外,在 JSON 配置文件的情况下,对查询参数应用 SQL、XSS、字段格式和表单字段签名称。

导入 JSON 错误页面

如果传入请求受到 DoS 攻击,并且当您阻止该请求时,设备将显示一条错误消息。为此,您必须导入 JSON 错误页面。 在命令提示窗口中,键入:

import appfw jsonerrorpage <src> <name> [-comment <string>] [-overwrite]

其中,

src. 用于存储导入的 JSON 错误对象的位置的 URL(协议、主机、路径和名称)。

注意

如果要导入的对象位于需要客户端证书身份验证才能访问的 HTTPS 服务器上,则导入将失败。这是一个强制性的论点。最大长度:2047 年。

名称。分配给 Citrix ADC 上 JSON 错误对象的名称。这是一个强制性的论点。最大长度:31 评论. 保留有关 JSON 错误对象的信息的任何注释。最大长度:255 覆盖。覆盖任何同名的现有 JSON 错误对象。

示例配置

Add appfw prof profjson –type JSON
Bind appfw prof profjson –JSONDoSURL “.*” -JSONMaxDocumentLengthCheck ON  -JSONMaxDocumentLength 30 -JSONMaxContainerDepthCheck ON  -JSONMaxContainerDepth  3 JSONMaxObjectKeyCountCheck ON  -JSONMaxObjectKeyCount  4 -JSONMaxObjectKeyLengthCheck  ON   -JSONMaxObjectKeyLength  10 -JSONMaxArrayLengthCheck ON  -JSONMaxArrayLength  5 -JSONMaxStringLengthCheck ON -JSONMaxStringLength 30

有效负载、日志消息和计数器示例:

JSONMaxDocumentLength 冲突

JSONMaxDocumentLength: 30 Payload: {“a”:”A”,”b”:”B”,”c”:”C”,”d”:”D”,”e”:”E”}

日志消息:

Document Length exceeds 20000000 May 29 20:23:32 <local0.info> 10.217.31.243 05/29/2019:20:23:32 GMT 0-PPE-0 : default APPFW APPFW_JSON_DOS_MAX_DOCUMENT_LENGTH 136 0 : 10.217.32.134 114-PPE0 - profjson http://10.217.30.120/forms/login.html Document exceeds maximum document length (30). cn1=30467 cn2=115 cs1=profjson cs2=PPE0 cs4=ALERT cs5=2019 act=blocked

计数器:

1 0 6 as_viol_json_dos
2 0 3 as_viol_json_dos_max_document_length
3 0 6 as_log_json_dos
4 0 3 as_log_json_dos_max_document_length
5 0 6 as_viol_json_dos_profile appfw__(profile1)
6 0 3 as_viol_json_dos_max_document_length_profile appfw__(profile1)
7 0 6 as_log_json_dos_profile appfw__(profile1)
8 0 3 as_log_json_dos_max_document_length_profile appfw__(profile1)

JSONMaxContainerDepth 冲突

JSONMaxContainerDepth: 3 Payload: {“a”: {”b”: {“c”: {“d”: {”e”:“f”}}}}}

日志消息:

May 29 19:33:59 <local0.info> 10.217.31.243 05/29/2019:19:33:59 GMT 0-PPE-1 : default APPFW APPFW_JSON_DOS_MAX_CONTAINER_DEPTH 4626 0 : 10.217.31.247 22-PPE1 – profjson http://10.217.30.120/forms/login.html Document at offset (15) exceeds maximum container depth (3). cn1=30466 cn2=113 cs1=profjson cs2=PPE0 cs4=ALERT cs5=2019 act=blocked

计数器:

36 20999 7 1 0 as_viol_json_dos
37 0 6 1 0 as_viol_json_dos_max_container_depth
38 0 7 1 0 as_log_json_dos
39 0 6 1 0 as_log_json_dos_max_container_depth
40 0 7 1 0 as_viol_json_dos_profile appfw__(profile1)
41 0 6 1 0 as_viol_json_dos_max_container_depth_profile appfw__(profile1)
42 0 7 1 0 as_log_json_dos_profile appfw__(profile1)
43 0 6 1 0 as_log_json_dos_max_container_depth_profile appfw__(profile1)

JSONMaxObjectKeyCount 冲突

JSONMaxObjectKeyCount:4

Payload: {“a”:”A”,“b”:“B”,“c”:“C”,“d”:“D”,”e”:“E”}

日志消息:

May 30 19:42:41 <local0.info> 10.217.31.243 05/30/2019:19:42:41 GMT 0-PPE-1 : default APPFW APPFW_JSON_DOS_MAX_OBJECT_KEY_COUNT 457 0 : 10.217.32.134 219-PPE1 - profjson http://10.217.30.120/forms/login.html Object at offset (41) that exceeds maximum key count (4). cn1=30468 cn2=118 cs1=profjson cs2=PPE0 cs4=ALERT cs5=2019 act=blocked

计数器:

94 119105 15 1 0 as_viol_json_dos
95 0 4 1 0 as_viol_json_dos_max_object_key_count
96 0 15 1 0 as_log_json_dos
97 0 4 1 0 as_log_json_dos_max_object_key_count
98 0 15 1 0 as_viol_json_dos_profile appfw__(profile1)
99 0 4 1 0 as_viol_json_dos_max_object_key_count_profile appfw__(profile1)
100 0 15 1 0 as_log_json_dos_profile appfw__(profile1)
101 0 4 1 0 as_log_json_dos_max_object_key_count_profile appfw__(profile1)

JSONMaxObjectKeyLength 冲突

JSONMaxObjectKeyLength: 10 Payload: {“a”:”A”,“b1234567890”:“B”,“c”:“C”,“d”:“D”,”e”:“E”}

日志消息:

May 31 20:26:10 <local0.info> 10.217.31.243 05/31/2019:20:26:10 GMT 0-PPE-1 : default APPFW APPFW_JSON_DOS_MAX_OBJECT_KEY_LENGTH 102 0 : 10.217.32.134 89-PPE1 - profjson http://10.217.30.120/forms/login.html Object key(b1234567890) at offset (12) exceeds maximum key length (10). cn1=30469 cn2=118 cs1=profjson cs2=PPE0 cs4=ALERT cs5=2019 act=blocked

计数器:

242172 6 1 0 as_viol_json_dos
0 1 1 0 as_viol_json_dos_max_object_key_length
10 0 5 1 0 as_log_json_dos
11 0 1 1 0 as_log_json_dos_max_object_key_length
12 0 6 1 0 as_viol_json_dos_profile appfw__(profile1)
13 0 1 1 0 as_viol_json_dos_max_object_key_length_profile appfw__(profile1)
14 0 5 1 0 as_log_json_dos_profile appfw__(profile1)
15 0 1 1 0 as_log_json_dos_max_object_key_length_profile appfw__(profile1)

JSONMaxArrayLength 冲突

JSONMaxArrayLength: 5 Payload: {“a”:”A”,“c”:[”d”,”e”,”f”,”g”,”h”,”i”],”e”:[“E”,“e”]}

日志消息:

May 29 20:58:39 <local0.info> 10.217.31.243 05/29/2019:20:58:39 GMT 0-PPE-1 : default APPFW APPFW_JSON_DOS_MAX_ARRAY_LENGTH 4650 0 : 10.217.32.134 153-PPE1 -profjson http://10.217.30.120/forms/login.html Array at offset (37) that exceeds maximum array length (5). cn1=30469 cn2=120 cs1=profjson cs2=PPE0 cs4=ALERT cs5=2019 act=blocked

计数器:

36 182293 10 1 0 as_viol_json_dos
37 0 1 1 0 as_viol_json_dos_max_array_length
38 0 10 1 0 as_log_json_dos 39 0 1 1 0 as_log_json_dos_max_array_length
40 0 10 1 0 as_viol_json_dos_profile appfw__(profile1)
41 0 1 1 0 as_viol_json_dos_max_array_length_profile appfw__(profile1)
42 0 10 1 0 as_log_json_dos_profile appfw__(profile1)
43 0 1 1 0 as_log_json_dos_max_array_length_profile appfw__(profile1))

JSONMaxStringLength 冲突

JSONMaxStringLength:10

Payload: {“a”:”A”,“c”:”CcCcCcCcCcCcCcCcCc”,”e”:[“E”,“e”]}

日志消息:

May 29 20:05:02 <local0.info> 10.217.31.243 05/29/2019:20:05:02 GMT 0-PPE-0 : default APPFW APPFW_JSON_DOS_MAX_STRING_LENGTH 134 0 : 10.217.32.134 80-PPE0 - profjson http://10.217.30.120/forms/login.html String(CcCcCcCcCcCcCc) at offset (27) that exceeds maximum string length (10). n1=30470 cn2=122 cs1=profjson cs2=PPE0 cs4=ALERT cs5=2019 act=blocked

计数器:

44 91079 3 1 0 as_viol_json_dos
45 0 1 1 0 as_viol_json_dos_max_string_length
46 0 3 1 0 as_log_json_dos
47 0 1 1 0 as_log_json_dos_max_string_length
48 0 3 1 0 as_viol_json_dos_profile appfw__(profile1)
49 0 1 1 0 as_viol_json_dos_max_string_length_profile appfw__(profile1)
50 0 3 1 0 as_log_json_dos_profile appfw__(profile1)
51 0 1 1 0 as_log_json_dos_max_string_length_profile appfw__(profile1

使用 Citrix GUI 配置 JSON DoS 保护

按照以下步骤设置 JSON DoS 防护设置。

  1. 在导航窗格中,导航到安全 > 配置文件
  2. 配置文件页中,单击添加
  3. Citrix Web App Firewall 配置文件 页面中,单击 高级设置下的安全检查
  4. 安全检查 部分,转到 JSON 拒绝服务 设置。
  5. 单击复选框附近的可执行文件图标。

    JSON DoS 安全检查

  6. 单击 操作设置 以访问 JSON 拒绝服务设置 页面。
  7. 选择 JSON DoS 操作。
  8. 单击确定

    JSON DoS 操作设置

  9. Citrix Web App Firewall 配置文件 页面中,单击高级设置下的放宽规则
  10. 放宽规则部分,选择 JSON 拒绝服务 设置,然后单击编辑

    JSON DoS 放宽规则

  11. 应用程序防火墙 JSON 拒绝服务检查 中设置 JSON DoS 验证值。
  12. 单击确定

    JSON DoS 放宽规则

  13. Citrix Web App Firewall 配置文件 页面中,单击高级设置下的配置文件设置
  14. 配置文件设置 部分,转到 JSON 错误设置 子部分以设置 JSON DoS 错误 页面。

    JSON DoS 放宽规则

  15. JSON 错误页面导入对象 页面中,设置以下参数:

    1. 从导入。将错误页面导入为文本、文件或 URL。
    2. URL。URL 将用户重定向到错误页面。 1 个 文件。选择要导入为 JSON DoS 错误文件的文件。
    3. 文字。输入 JSON 文件内容。
    4. 单击 继续。
    5. 文件。输入文件名。
    6. 文件内容。添加错误文件内容。
    7. 单击确定

    JSON DoS 导入错误页面

  16. 单击确定
  17. 单击完成

JSON 拒绝服务保护检查