Web App Firewall 支持谷歌 Web 工具包

注意: 此功能在 Citrix ADC 版本 10.5.e 中提供。

使用 Google Web 工具包 (GWT) 远程过程调用 (RPC) 机制的 Web 服务器可以由 Citrix Web App Firewall 保护,而无需任何特定配置即可启用 GWT 支持。

什么是 GWT

GWT 用于构建和优化复杂的高性能 Web 应用程序,由没有 XMLHttpRequest, 和 JavaScript 专业知识的人员。这个开源的免费开发工具包广泛用于开发小型和大型应用程序,并且经常用于显示基于浏览器的数据,例如航班、酒店等搜索结果。GWT 提供了一组核心 Java API 和小部件,用于编写可在大多数浏览器和移动设备上运行的优化 JavaScript 脚本。GWT RPC 框架使 Web 应用程序的客户端和服务器组件可以轻松地通过 HTTP 交换 Java 对象。GWT RPC 服务与基于 SOAP 或 REST 的 Web 服务不同。它们只是一种轻量级的方法,用于在服务器和客户端上的 GWT 应用程序之间传输数据。GWT 处理在方法调用中交换参数和返回值的 Java 对象的序列化。

有关使用 GWT 的流行网站,请参阅

https://www.quora.com/What-web-applications-use-Google-Web-Toolkit-%28GWT%29

GWT 请求的工作原理

GWT RPC 请求是管道分隔的,并具有可变数量的参数。它作为 HTTP POST 的有效负载进行,并具有以下值:

  1. 内容类型 = 文本/x gwt-rpc。字符集可以是任何值。
  2. 方法 = 发布。

如果内容类型为“文本/x gwt-rpc”,GET 和 POST HTTP 请求都被认为是有效的 GWT 请求。查询字符串现在支持作为 GWT 请求的一部分。将应用程序防火墙配置文件的“InspectQueryContentTypes”参数配置为“其他”,以检查内容类型“text/x-gwt-rpc”的请求查询部分。

以下示例显示了 GWT 请求的有效负载:

5|0|8|http://localhost:8080/test/|16878339F02B83818D264AE430C20468| com.test.client.TestService|testMethod|java.lang.String|java.lang.Integer| myInput1|java.lang.Integer/3438268394|1|2|3|4|2|5|6|7|8|1|

请求可分为三个部分:

( a)Header: 5|0|8|

前 3 位数字“5 0 8 ”,分别代表“版本,颠覆和表大小”。这些必须是正整数。

b)字符串表:

http://localhost:8080/test/|16878339F02B83818D264AE430C20468| com.test.client.TestService|testMethod|java.lang.String|java.lang.Integer|myInput1| java.lang.Integer/3438268394|

上述管道分隔字符串表的成员包含用户提供的输入。这些输入将针对 Web App Firewall 检查进行解析,并按如下方式进行标识:

  • 第一:http://localhost:8080/test/

    这是请求 URL。

  • 第二:16878339F02B83818D264AE430C20468

    唯一的十六进制标识符。如果此字符串具有非十六进制字符,请求将被视为格式错误。

  • rd : com.test.client.TestService

    服务类名称

  • 第四:testMethod

    服务方法名称

  • 第 5:java.lang.String|java.lang.Integer|myInput1|java.lang.Integer/3438268394

    数据类型和数据. 非原始数据类型被指定为

    <container>.<sub-cntnr>.name/<integer><identifier>

( c)Payload: 1|2|3|4|2|5|6|7|8|1|

负载包含对字符串表中元素的引用。这些整数值不能大于字符串表中的元素数。

针对 GWT 应用程序的 Web App Firewall 保护

Web App Firewall 理解和解释 GWT RPC 请求,检查有效负载是否存在安全检查冲突,并采取指定的操作。

针对 GWT 请求的 Web App Firewall 标头和 Cookie 检查类似于针对其他请求格式的检查。在适当的 URL 解码和字符集转换后,将检查字符串表中的所有参数。GWT 请求正文不包含字段名称,只包含字段值。通过使用 Web App Firewall 字段格式检查,可以根据指定的格式验证输入值,该检查也可用于控制输入的长度。Web App Firewall 可以很容易地检测和阻止输入中的 跨站点脚本SQL 注 入攻击。

学习和放宽规则:GWT 请求支持学习和部署放宽规则。Web App Firewall 规则采用 <actionURL> <fieldName> 映射的形式。GWT 请求格式没有字段名称,因此需要特殊处理。Web App Firewall 会在已学习的规则中插入虚拟字段名称,这些规则可以作为放宽规则部署。-isregex 标志与非 GWT 规则一样工作。

  • 操作 URL:

    可以在同一个 Web 服务器上配置响应 RPC 的多个服务。HTTP 请求具有 Web 服务器的 URL,而不是处理 RPC 的实际服务的 URL。因此,不会基于 HTTP 请求 URL 应用放宽,因为这会放宽目标字段的该 URL 上的所有服务。对于 GWT 请求,Web App Firewall 使用 GWT 有效负载中找到的实际服务的 URL(字符串表的第四个字段)。

  • 字段名称:

    由于 GWT 请求正文仅包含字段值,因此 Web App Firewall 会在推荐学习规则时插入虚拟字段名称,如 1、2 等。

    GWT 学习规则的示例

     POST /abcd/def/gh HTTP/1.1
     Content-type: text/x-gwt-rpc
     Host: 10.217.222.75
     Content-length: 157
    
     5|0|8|http://localhost:8080/acdtest/|16878339F02Baf83818D264AE430C20468|
     com.test.client.TestService|testMethod|java.lang.String%3b|java.lang.Integer|onblur|
    
       The learn data will be as follows:
     > sh learningdata pr1 crossSiteScripting
     Profile: pr1    SecurityCheck: crossSiteScripting
     1)  Url:    http://localhost:8080/acdtest/  >> From GWT Payload.
         Field:  10
         Hits:   1
      Done
    

    GWT 放宽规则的示例

    bind appfw profile pr1 -crossSiteScripting 1 abcd -isregex NOTREGEX

日志消息:Web App Firewall 会为 GWT 请求中检测到的安全检查冲突生成日志消息。由格式错误的 GWT 请求生成的日志消息包含字符串“GWT”以便于识别。

格式错误的 GWT 请求的日志消息示例:

Dec 5 21:48:02 <local0.notice> 10.217.31.247 12/05/2014:21:48:02 GMT ns 0-PPE-0 : APPFW Message 696 0 : "GWT RPC request with malformed payload. <blocked>”

处理 GWT 与非 GWT 请求的区别:

相同的负载可针对不同的内容类型触发不同的 Web App Firewall 安全检查冲突。请参见以下示例:

5|0|8|http://localhost:8080/acdtest/|16878339F02Baf83818D264AE430C20468|com.test.client.TestService|testMethod|java.lang.String%3b|java.lang.Integer|select|

内容类型:应用/x-www 形式编码

如果 SQL 注入类型配置为使用四个可用选项中的任何一个,则使用此内容类型发送的请求会导致 SQL 冲突:SQLSplCharANDKeyword、SQLSplCharORKeyword、SQLKeyword 或 SQLSplChar。在处理上述有效负载时,Web App Firewall 将 ‘&’ 视为字段分隔符,’=’ 视为名称-值分隔符。由于这些字符都不会出现在帖子正文中的任何位置,因此整个内容被视为单个字段名称。此请求中的字段名称包含 SQL 特殊字符 (;) 和 SQL 关键字 (选择)。因此,针对所有四个 SQL 注入类型选项捕获冲突行为。

内容类型:文本/x gwt-rpc

只有当 SQL 注入类型设置为以下三个选项之一时,使用此内容类型发送的请求才会触发 SQL 冲突:SQLSplCharORKeyword、SQLKeyword 或 SQLSplChar。如果 SQL 注入类型设置为 SQLSplCharANDKeyword(默认选项),则不会触发冲突。Web App Firewall 认为垂直栏 ‘ ‘作为 GWT 请求中上述有效负载的字段分隔符。因此,帖子正文被分为不同的表单字段值,并添加表单字段名称(根据前面描述的约定)。由于这种拆分,SQL 特殊字符和 SQL 关键字将成为单独表单字段的一部分。

表单字段 8:爪哇语。字符串 %3b->%3b 是 (;) 字符

表单字段 10:选择

因此,当 SQL 注入类型设置为 SQLSplchar时,字段 8 表示 SQL 冲突。对于 SQLKeyword,字段 10 表示冲突。如果使用 SQLSplCharORKeyword 选项配置 SQL 注入类型(查找是否存在关键字或特殊字符),则这两个字段中的任何一个字段都可能指示存在冲突。没有针对默认的 SQLSplCharANDKeyword 选项捕获冲突行为,因为没有单个字段具有同时包含 SQLSplCharSQLKeyword 的值。

提示

  • 无需特殊的 Web App Firewall 配置即可启用 GWT 支持。
  • 内容类型必须是文本 /x-gwt-rpc。
  • 学习和部署应用于 GWT 负载的所有相关 Web App Firewall 安全检查的放宽规则与其他受支持的内容类型相同。
  • 只有 POST 请求才被视为对 GWT 有效。如果内容类型为文本 /x-gwt-rpc,则阻止所有其他请求方法。
  • GWT 请求受配置文件配置的 POST 正文限制的约束。
  • 安全检查的无会话设置不适用,将被忽略。
  • GWT 日志消息支持 CEF 日志格式。