ADC

使用签名保护 JSON 应用程序

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

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

  • 应用程序/x-javascri
  • 文本/javascri
  • 文本/x-javascri
  • text/x-json

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

为了允许 JSON 请求,设备预先配置了 JSON 内容类型,如以下 show-command 输出所示:

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

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

  • 应用程序/x-www-form-urlencoded
  • multipart/form-data
  • text/x-gwt-rpc

通过其他内容类型标头(包括 application/json(或任何其他允许的内容类型)收到的请求将在标头检查后转发到后端。即使启用了 SQL 或跨站点脚本等配置文件的安全检查,也不会检查此类请求中的帖子正文是否存在违反安全检查的情况。

为了保护 JSON 应用程序和检测违规行为,可以使用 Web App Firewall 签名。Web App Firewall 会处理所有包含允许的内容类型标头的请求以进行签名匹配。您可以添加自己的自定义签名规则来处理 JSON 负载,以执行各种安全检查检查(例如,跨站脚本、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 负载中的跨站脚本的签名示例

<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>
<!--NeedCopy-->

有效载荷示例

以下负载会触发签名匹配,因为它包含跨站脚本标签 <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"}}}}}
<!--NeedCopy-->

日志消息示例

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>
<!--NeedCopy-->

注意

如果您在移除跨站脚本标签后发送了相同的负载 (<Gotcha!!>),则未触发签名规则匹配。

重要内容

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

使用 SQL 和跨站点脚本编码的负载使用策略和签名保护应用程序或 JSON 内容类型

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

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

您必须添加以下策略并将其绑定到全局虚拟服务器以支持 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|where|group|begin|join|exists|distinct|add|modify|constraint|null|like|exec|execute|char|or|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>

<!--NeedCopy-->