使用签名保护 JSON 应用程序

JavaScript 对象符号 (JSON) 是一种基于文本的开放标准,从 JavaScript 脚本语言派生出来。JSON 是简单数据结构和关联数组(称为对象)的人类可读表示的首选。它作为 XML 的替代方案,主要用于传输序列化数据结构,以便与 Web 应用程序进行通信。JSON 文件通常使用 .json 扩展名保存。

JSON 负载通常使用指定为 应用程序 /json的 MIME 类型发送。JSON 的其他“标准”内容类型是:

  • application/x-javascript
  • text/javascript
  • text/x-javascript
  • 文本/x-json

使用 Citrix Web App Firewall 签名保护 JSON 应用程序

为了允许 JSON 请求,设备已使用 JSON 内容类型预配置,如以下显示命令输出所示:

> sh appfw jsonContentType
1)      JSONContenttypevalue:  "^application/json$" IsRegex:  REGEX
Done

Citrix Web App Firewall 仅处理以下内容类型的帖子正文:

  • 应用程序/x-www 形式的乌龙编码
  • 多部分/表格数据
  • 文本/x-gwt-rpc

随其他内容类型标头(包括应用程序 /json(或任何其他允许的内容类型)一起接收的请求将在标头检查后转发到后端。即使启用了配置文件的安全检查(如 SQL 或 XSS),也不会检查此类请求中的帖子正文是否存在安全检查冲突情况。

为了保护 JSON 应用程序并检测冲突情况,可以使用 Web App Firewall 签名。所有包含允许的内容类型标头的请求都由 Web App Firewall 处理,以便进行签名匹配。您可以添加自己的自定义签名规则来处理 JSON 负载,以执行各种安全检查检查(例如,XSS、SQL 和字段一致性),以检测标头和帖子正文中的冲突,并执行指定的操作。

提示

与其他内置默认值不同,可以使用 CLI 或 GUI (GUI) 编辑或删除预配置的 JSON 内容类型。如果 JSON 应用程序的合法请求被阻止并触发内容类型冲突,请检查以确保内容类型值配置正确。有关 Web App Firewall 如何处理内容类型标头的其他详细信息,请参阅内容类型保护

使用命令行界面添加或删除 JSON 内容类型

在命令提示窗口中,键入以下命令之一:

add appfw jsonContentType ^application/json$ IsRegEx REGEX

rm appfw JSONContentType "^application/json$"

使用 GUI 管理 JSON 内容类型

导航到“安全”>“Web App Firewall”,然后在“设置”部分选择“管理 JSON 内容类型”。

在“配置 Web App Firewall JSON 内容类型”面板中,添加、编辑或删除 JSON 内容类型以满足应用程序的需求。

配置签名保护以检测 JSON 有效负载中的攻击

除了有效的 JSON 内容类型之外,您还需要配置签名以指定在 JSON 请求中检测到时表示存在安全漏洞的模式。当传入请求触发签名规则中所有目标模式的匹配时,会执行指定的操作(例如阻止和日志)。

要添加自定义签名规则,Citrix 建议您使用 GUI。导航到“系统”>“安全”>“Web App Firewall”>“签名”。双击目标签名对象以访问“编 辑 Web App Firewall 签名”面板。点击 加按钮来配置操作、类别、日志字符串、规则模式等。尽管 Web App Firewall 检查所有允许的内容类型负载是否匹配签名,但您可以通过在规则中指定 JSON 表达式来优化处理。添加 新规则模式时,请在“匹配”的下拉选项中选择“表达 式”,然后从 JSON 负载中提供目标匹配表达式,以确定需要检查的特定请求。表达式必须以 TEXT. 前缀开头。您可以添加其他规则模式来指定其他匹配模式来识别攻击。

以下示例显示了签名规则。如果在 JSON 负载的 POST 正文中检测到与指定的 XPATH_JSON 表达式匹配的任何跨站点脚本标记,则会触发签名匹配。

用于在 JSON 有效负载中检测 XSS 的签名示例

<SignatureRule actions="log,stats" category="JSON" enabled="ON" id="1000001" severity="" source="" type="" version="1">

  <PatternList>

    <RequestPatterns>

      <Pattern>

        <Location area="HTTP_POST_BODY"/>

        <Match type="Expression">TEXT.XPATH_JSON(xp%/glossary/title%).CONTAINS("example glossary")</Match>

      </Pattern>

      <Pattern>

        <Location area="HTTP_METHOD"/>

        <Match type="LITERAL">POST</Match>

      </Pattern>

      <Pattern>

        <Location area="HTTP_POST_BODY"/>

        <Match type="CrossSiteScripting"/>

       </Pattern>

    </RequestPatterns>

  </PatternList>

  <LogString>Cross-site scripting violation detected in json payload</LogString>

  <Comment/>

</SignatureRule>

有效载荷示例

以下有效负载触发签名匹配,因为它包含跨站点脚本标记 <Gotcha!!>

{"glossary": {"title": "example glossary","GlossDiv": {"title": "S","GlossList": {"GlossEntry": {"ID": "SGML","SortAs": "SGML","GlossTerm": "Standard Generalized Markup Language","Acronym": "SGML","Abbrev": "ISO 8879:1986","GlossDef": {"para": "A meta-markup language, used to create markup languages \*\*<Gotcha!!>\*\* such as DocBook.","GlossSeeAlso": ["GML", "XML"]},"GlossSee": "markup"}}}}}

日志消息示例

Aug 21 12:21:42 <local0.info> 10.217.31.239 08/21/2015:23:21:42 GMT ns 0-PPE-1 : APPFW APPFW_SIGNATURE_MATCH 1471 0 :  10.217.253.62 990-PPE0 NtJnVMNnvPeQJnaUzXYW/GTvAQsA010 prof1 http://10.217.31.212/FFC/login_post.php Signature violation rule ID 1000001: cross-site scripting violation detected in json payload  <not blocked>

注意

如果您在删除跨站点脚本标签后发送相同的有效载荷(«Gotcha!!>),则不会触发签名规则匹配。

重要内容

  • 要保护 JSON 负载,请使用 Web App Firewall 签名来检测 XSS、SQL 和其他冲突行为。
  • 验证 JSON 内容类型是否在设备上配置为允许的内容类型。
  • 确保负载中的内容类型与配置的 JSON 内容类型匹配。
  • 请确保签名规则中配置的所有模式都匹配,以便触发签名冲突。
  • 添加签名规则时,它必须至少具有一个规则模式才能匹配 JSON 负载中的表达式。签名规则中的所有 PI 表达式都必须以前缀 TEXT 开头。并且必须为布尔值。

使用策略和签名使用 SQL 和 XSS 编码的有效负载保护应用程序或 JSON 内容类型

Citrix Web App Firewall 可以使用策略和签名保护应用程序或 JSON 内容类型。

使用策略检查 SQL 注入的应用程序或 JSON 内容类型

您必须添加以下策略并将其绑定到全局虚拟服务器以支持 SQL 注入。

`add appfw policy sqli_1 HTTP.REQ.BODY(10000).SET_TEXT_MODE(IGNORECASE).SET_TEXT_MODE(URLENCODED).DECODE_USING_TEXT_MODE.REGEX_MATCH(re#(((\A)|(?<=[^a-zA-Z0-9_])))(select|insert|delete|update|drop|create|alter|grant|revoke|commit|rollback|shutdown|union|intersect|minus|case|decode|其中|group|begin|join|exists|distinct|add|modify|constraint|null|like|exec|execute|char|或|and|sp_sdidebug)(( Z)|(?=[^a-zA-Z0-9_]))#) APPFW_BLOCK`

`add appfw policy sqli_2 HTTP.REQ.BODY(10000).SET_TEXT_MODE(IGNORECASE).SET_TEXT_MODE(URLENCODED).DECODE_USING_TEXT_MODE.REGEX_MATCH(re#((\A)|(?<=[^a-zA-Z0-9_]))(xp_availablemedia|xp_cmdshell|xp_deletemail|xp_dirtree|xp_dropwebtask|xp_dsninfo|xp_enumdsn|xp_enumerrorlogs|xp_enumgroups|xp_enumqueuedtasks|xp_eventlog|xp_findnextmsg|xp_fixeddrives|xp_getfiledetails|xp_getnetname|xp_grantlogin|xp_logevent|xp_loginconfig|xp_logininfo|xp_makewebtask|xp_msver|xp_regread|xp_perfend|xp_perfmonitor|xp_perfsample|xp_perfstart|xp_readerrorlog|xp_readmail|xp_revokelogin|xp_runwebtask|xp_schedulersignal|xp_sendmail|xp_servicecontrol|xp_snmp_getstate|xp_snmp_raisetrap|xp_sprintf|xp_sqlinventory|xp_sqlregister|xp_sqltrace|xp_sscanf|xp_startmail|xp_stopmail|xp_subdirs|xp_unc_to_drive)(( Z)|(?=[^a-zA-Z0-9_]))#) APPFW_BLOCK`

`add appfw policy sqli_3 HTTP.REQ.BODY(10000).SET_TEXT_MODE(IGNORECASE).SET_TEXT_MODE(URLENCODED).DECODE_USING_TEXT_MODE.REGEX_MATCH(re#((\A)|(?<=[^a-zA-Z0-9_]))(sysobjects|syscolumns|MSysACEs|MSysObjects|MSysQueries|MSysRelationships)(( Z)|(?=[^a-zA-Z0-9_]))#) APPFW_BLOCK`

`add appfw policy sqli_4 HTTP.REQ.BODY(10000).SET_TEXT_MODE(IGNORECASE).SET_TEXT_MODE(URLENCODED).DECODE_USING_TEXT_MODE.REGEX_MATCH(re#((\A)|(?<=[^a-zA-Z0-9_]))(SYS.USER_OBJECTS|SYS.TAB|SYS.USER_TABLES|SYS.USER_VIEWS|SYS.ALL_TABLES|SYS.USER_TAB_COLUMNS|SYS.USER_CONSTRAINTS|SYS.USER_TRIGGERS|SYS.USER_CATALOG|SYS.ALL_CATALOG|SYS.ALL_CONSTRAINTS|SYS.ALL_OBJECTS|SYS.ALL_TAB_COLUMNS|SYS.ALL_TAB_PRIVS|SYS.ALL_TRIGGERS|SYS.ALL_USERS|SYS.ALL_VIEWS|SYS.USER_ROLE_PRIVS|SYS.USER_SYS_PRIVS|SYS.USER_TAB_PRIVS)(( Z)|(?=[^a-zA-Z0-9_]))#) APPFW_BLOCK`

使用签名检查应用程序或 JSON 内容类型

您可以将以下签名规则添加到应用程序防火墙配置文件中的签名对象,以支持 JSON 内容类型的 SQL 注入。

注意:

后的正文签名是占用大量的。

<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 2013-2018 Citrix Systems, Inc. All rights reserved. -->
<SignaturesFile schema_version="6" version="0" minor_schema_version="0">
    <Signatures>
        <SignatureRule id="4000000" enabled="ON" actions="log,block" category="sql" source="" severity="" type="" version="1" sourceid="" harmscore="">
            <PatternList>
                <RequestPatterns>
                    <Pattern>
                        <Location area="HTTP_POST_BODY"/>
                        <Match type="Expression">TEXT.SET_TEXT_MODE(IGNORECASE).SET_TEXT_MODE(URLENCODED).DECODE_USING_TEXT_MODE.REGEX_MATCH(re#(((\A)|(?<=[^a-zA-Z0-9_])))(select|insert|delete|update|drop|create|alter|grant|revoke|commit|rollback|shutdown|union|intersect|minus|case|decode|where|group|begin|join|exists|distinct|add|modify|constraint|null|like|exec|execute|char|or|and|sp_sdidebug)((
Z)|(?=[^a-zA-Z0-9_]))#)</Match>
                    </Pattern>
                    <Pattern type="fastmatch">
                        <Location area="HTTP_METHOD"/>
                        <Match type="LITERAL">T</Match>
                    </Pattern>
                </RequestPatterns>
            </PatternList>
            <LogString>sql Injection</LogString>
            <Comment/>
        </SignatureRule>
        <SignatureRule id="4000001" enabled="ON" actions="log,block" category="sql" source="" severity="" type="" version="1" sourceid="" harmscore="">
            <PatternList>
                <RequestPatterns>
                    <Pattern>
                        <Location area="HTTP_POST_BODY"/>
                        <Match type="Expression">TEXT.SET_TEXT_MODE(IGNORECASE).SET_TEXT_MODE(URLENCODED).DECODE_USING_TEXT_MODE.REGEX_MATCH(re#((\A)|(?<=[^a-zA-Z0-9_]))(xp_availablemedia|xp_cmdshell|xp_deletemail|xp_dirtree|xp_dropwebtask|xp_dsninfo|xp_enumdsn|xp_enumerrorlogs|xp_enumgroups|xp_enumqueuedtasks|xp_eventlog|xp_findnextmsg|xp_fixeddrives|xp_getfiledetails|xp_getnetname|xp_grantlogin|xp_logevent|xp_loginconfig|xp_logininfo|xp_makewebtask|xp_msver|xp_regread|xp_perfend|xp_perfmonitor|xp_perfsample|xp_perfstart|xp_readerrorlog|xp_readmail|xp_revokelogin|xp_runwebtask|xp_schedulersignal|xp_sendmail|xp_servicecontrol|xp_snmp_getstate|xp_snmp_raisetrap|xp_sprintf|xp_sqlinventory|xp_sqlregister|xp_sqltrace|xp_sscanf|xp_startmail|xp_stopmail|xp_subdirs|xp_unc_to_drive)((
Z)|(?=[^a-zA-Z0-9_]))#)</Match>
                    </Pattern>
                    <Pattern type="fastmatch">
                        <Location area="HTTP_METHOD"/>
                        <Match type="LITERAL">T</Match>
                    </Pattern>
                </RequestPatterns>
            </PatternList>
            <LogString>sql Injection</LogString>
            <Comment/>
        </SignatureRule>
        <SignatureRule id="4000002" enabled="ON" actions="log,block" category="sql" source="" severity="" type="" version="1" sourceid="" harmscore="">
            <PatternList>
                <RequestPatterns>
                    <Pattern>
                        <Location area="HTTP_POST_BODY"/>
                        <Match type="Expression">TEXT.SET_TEXT_MODE(IGNORECASE).SET_TEXT_MODE(URLENCODED).DECODE_USING_TEXT_MODE.REGEX_MATCH(re#((\A)|(?<=[^a-zA-Z0-9_]))(sysobjects|syscolumns|MSysACEs|MSysObjects|MSysQueries|MSysRelationships)((
Z)|(?=[^a-zA-Z0-9_]))#)</Match>
                    </Pattern>
                    <Pattern type="fastmatch">
                        <Location area="HTTP_METHOD"/>
                        <Match type="LITERAL">T</Match>
                    </Pattern>
                </RequestPatterns>
            </PatternList>
            <LogString>sql Injection</LogString>
            <Comment/>
        </SignatureRule>
        <SignatureRule id="4000003" enabled="ON" actions="log,block" category="sql" source="" severity="" type="" version="1" sourceid="" harmscore="">
            <PatternList>
                <RequestPatterns>
                    <Pattern>
                        <Location area="HTTP_POST_BODY"/>
                        <Match type="Expression">TEXT.SET_TEXT_MODE(IGNORECASE).SET_TEXT_MODE(URLENCODED).DECODE_USING_TEXT_MODE.REGEX_MATCH(re#((\A)|(?<=[^a-zA-Z0-9_]))(SYS.USER_OBJECTS|SYS.TAB|SYS.USER_TABLES|SYS.USER_VIEWS|SYS.ALL_TABLES|SYS.USER_TAB_COLUMNS|SYS.USER_CONSTRAINTS|SYS.USER_TRIGGERS|SYS.USER_CATALOG|SYS.ALL_CATALOG|SYS.ALL_CONSTRAINTS|SYS.ALL_OBJECTS|SYS.ALL_TAB_COLUMNS|SYS.ALL_TAB_PRIVS|SYS.ALL_TRIGGERS|SYS.ALL_USERS|SYS.ALL_VIEWS|SYS.USER_ROLE_PRIVS|SYS.USER_SYS_PRIVS|SYS.USER_TAB_PRIVS)((
Z)|(?=[^a-zA-Z0-9_]))#)</Match>
                    </Pattern>
                    <Pattern type="fastmatch">
                        <Location area="HTTP_METHOD"/>
                        <Match type="LITERAL">T</Match>
                    </Pattern>
                </RequestPatterns>
            </PatternList>
            <LogString>sql Injection</LogString>
            <Comment/>
        </SignatureRule>
    </Signatures>
</SignaturesFile>