ADC

Web App Firewall 支持 Google 网络工具包

注意: 此功能在 NetScaler 版本 10.5.e 中可用。

遵循 Google Web Toolkit (GWT) 远程过程调用 (RPC) 机制的 Web 服务器可以由 NetScaler Web App Firewall 保护,无需任何特定配置即可启用 GWT 支持。

什么是 GWT

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

有关使用 GWT 的热门网站,请参阅

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

GWT 请求的工作原理

GWT RPC 请求采用管道分隔且具有可变数量的参数。它作为 HTTP POST 的有效载荷传输,具有以下值:

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

如果内容类型为“text/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|
<!--NeedCopy-->

请求可以分为三个部分:

a) Header: 5|0|8|

上述请求 5|0|8| 中的前 3 位数字分别表示“表的版本、子版本和大小”。这些必须是正整数。

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 检查,标识如下:

  • 第 1 名: http://localhost:8080/test/

    这是请求 URL。

  • 第 2 名: 16878339F02B83818D264AE430C20468

    独特的十六进制标识符。如果此字符串包含非十六进制字符,则认为请求格式不正确。

  • 第 3 名: com.test.client.TestService

    服务类别名称

  • 第 4 名: 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 检查与其他请求格式的标头和 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
     <!--NeedCopy-->
    

    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-form-urlencoded:

如果将 SQL 注入类型配置为使用四个可用选项中的任何一个:sqlsplcharandKeyword、sqlsplCharorKeyword、sqlKeyword 或 sqlsplChar,则使用此内容类型发送的请求会导致 SQL 违规。在处理上述负载时,Web App Firewall 将“&”视为字段分隔符,将“=”视为名称/值分隔符。由于这两个字符都没有出现在帖子正文的任何地方,因此整个内容被视为单个字段名称。此请求中的字段名同时包含 SQL 特殊字符 (;) 和 SQL 关键字(选择)。因此,所有四个 SQL 注入类型选项都会出现违规情况。

内容类型:text/x-gwt-rpc:

只有将 SQL 注入类型设置为以下三个选项之一时,使用此内容类型发送的请求才会触发 SQL 违规:sqlsplCharorKeyworkey、sqlKeyword 或 sqlsplChar。如果将 SQL 注入类型设置为 sqlsplCharandKeyword(默认选项),则不会触发任何违规行为。Web App Firewall | 将竖线视为 GWT 请求中上述负载的字段分隔符。因此,帖子正文分为各种表单字段值,并添加了表单字段名称(按照前面描述的惯例)。由于这种拆分,SQL 特殊字符和 SQL 关键字成为单独表单字段的一部分。

表单字段 8: java.lang.String%3b -\> %3b is the (;) char

表单字段 10: select

因此,当 SQL 注入类型设置为 sqlsplChar时,字段 8 表示 SQL 违规。对于 SQLKeyword,字段 10 表示违规。如果将 SQL 注入类型配置为 sqlsplCharorKeywor d 选项,则这两个字段中的任何一个都可能表示存在违规,该选项会查找是否存在关键字或特殊字符。 **没有发现默认 **sqlsplCharandKeyw ord 选项存在任何违规行为,因为没有任何一个字段的值同时包含 sqlsplChar 和 sqlKeyword。**

小贴士

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