Citrix ADC

使用签名保护JSON应用程序

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

JSON有效负载通常使用指定的MIME类型发送application / json. JSON的其他“标准”内容类型包括:

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

使用Citrix Web App防火墙签名保护JSON应用程序

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

> sh appfw jsonContentType 1) jsonContentType: "^application/json$" IsRegex: REGEX完成

Citrix Web应用防火墙只处理以下内容类型的文章体:

  • 应用程序/ x-www-form-urlencoded
  • 多部分/格式
  • text/x-gwt-rpc

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

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

提示

与其他内置默认值不同,可以使用CLI或GUI (GUI)编辑或删除预先配置的JSON内容类型。如果对JSON应用程序的合法请求被阻止并触发内容类型冲突,请检查以确保内容类型值配置正确。有关Web应用程序防火墙如何处理内容类型报头的更多细节,请参见内容类型保护

通过使用命令行接口添加或删除JSON内容类型

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

添加appfw jsonContentType ^application/json$ IsRegEx REGEX

rm appfw JSONContentType“^application/json$”

使用GUI管理JSON内容类型

引导到安全>Web应用防火墙,在设置节,选择管理JSON内容类型

配置Web应用防火墙JSON内容类型面板,添加、编辑或删除JSON内容类型以满足应用程序的需要。

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

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

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

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

用于检测JSON负载中跨站点脚本的签名示例

     TEXT.XPATH_JSON(xp%/glossary/title%)。CONTAINS("example glossary")    POST        Cross-site scripting violation detected in json payload   

有效负载示例

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

{“glossary”:{“title”:“example glossary”,“GlossDiv”:{“title”:“S”,“GlossList”:{“GlossEntry”:{“ID”:“SGML”,“sorta”:“SGML”,“GlossTerm”:“标准通用标记语言”,“首字母缩略词”:“SGML”,“Abbrev”:“iso8879:1986”,“GlossDef”:{“para”:“一种元标记语言,用于创建标记语言****如DocBook”,“glossseeal”:[“GML”,“XML”]},“glossee”:“markup”}<!--NeedCopy-->

日志信息的示例

8月21日12:21:4210.217.31.239 08/21/2015:23:21:42 GMT ns 0-PPE-1:APPFW-APPFW_签名匹配1471 0:10.217.253.62 990-PPE0 NTJNVMNVPEQJNAUZXYW/GTvAQsA010 prof1http://10.217.31.212/FFC/login_post.php 签名冲突规则ID 1000001:在json有效负载中检测到跨站点脚本冲突<未阻止><!--NeedCopy-->

笔记

如果您在删除跨站点脚本标记(<问题! !>),则不触发签名规则匹配。

集锦

  • 为了保护JSON有效载荷,请使用Web应用防火墙签名来检测跨站脚本、SQL和其他违规行为。
  • 验证该设备上的JSON内容类型是否配置为允许的内容类型。
  • 确保有效负载中的内容类型与配置的JSON内容类型匹配。
  • 请确保签名规则中配置的所有模式都匹配将要触发的签名违规。
  • 当您添加签名规则时,它必须至少有一个rule模式来匹配JSON有效负载中的Expression。签名规则中所有PI表达式必须以前缀“TEXT”开头。并且必须是布尔值。

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

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

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

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

添加appfw策略sqli_1 HTTP.REQ.BODY(10000)。设置_TEXT_模式(IGNORECASE)。设置_TEXT_模式(URLENCODED)。使用_TEXT_模式解码。REGEX_匹配(re#((\\A)|(?<=[A-zA-Z0-9]))(选择)插入/插入/删除/删除/删除/删除/插入/插入/插入/插入/删除/删除/删除/删除/删除/删除/删除/删除/删除/删除/删除/删除/删除/删除/删除/删除/删除/更新/更新/更新/删除/删除/删除/删除/删除/删除/删除/删除/删除/删除/删除/删除/删除/删除/删除/删除/删除/删除/删除/删除;创建/改变/撤销/撤销/提交/撤销/提交/撤销/提交/撤销/提交/撤销/提交/撤销/提交/提交/撤销/撤销/提交/提交/撤销/提交/提交/提交/收收收收合合,提交/提交/提交/提交/提交/撤销;提交/提交/提交/提交/撤销;提交/提交/提交/撤销;提交/收收收收回;提交/提交/提交/提交/提交/提交/提交/提交/提交/收收收合合合合合合合;关关关关关关关关;关闭;关闭/合合合zA-Z0-9))#)APPFW_区块

添加appfw策略sqli_2 HTTP.REQ.BODY(10000)。设置文本模式(IGNORECASE)。设置文本模式(URLENCODED)。使用文本模式解码。正则表达式匹配(re#(\\A)|(?<=[^A-zA-Z0-9]))(xp)目前的可用性媒体(xp)的访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问,访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问,访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问访问xp|makewebtask | xp|msver | xp|u重新研磨| xp|u性能| xp|u性能监视器| xp|u性能样本| xp_(1)xp运行网络任务(2)xp运行网络任务(2)xp运行网络任务(2)xp运行网络任务(2)xp运行网络任务(2)xp运行网络任务(2)xp调度人员信号(4)xp发送邮件(4)xp运行方方方方方方方方方方方当事人(2)xp(2)运行方当事人(2)运行方当事人(2)运行方当事人(2)运行方当事人(2)运行方当事人(2)运行方当事人(2)运行方当事人(2)运行方当事人(2)运行方)运行方当事人(2)运行方当事人(2)运行方(2)运行方)运行方当事人(2)运行方(2)运行方(2)运行方)工作任务任务任务(2)运行方(2)运行方(2)运行方)运行方(2)运行方(2)运行方)运行方(2)运行方(2)运行方)运行方(2)运行方(2)运行方(2)任务任务任务任务(2)运行方)xp|(?=[^a-zA-Z0-9|])#)APPFW_区块

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_3 HTTP.REQ.BODY(10000).SET_TEXT_MODE(IGNORECASE).SET_TEXT_MODE(IGNORECASE).SET_TEXT_MODE(URLENCODED).DECODE_USING_TEXT_MODE.REGEX_MATCH(re#(((\\A)|(

添加appfw policy sqli_4HTTP.REQ.BODY (10000) .SET_TEXT_MODE (IGNORECASE) .SET_TEXT_MODE URLENCODED .DECODE_USING_TEXT_MODE.REGEX_MATCH (re # ((\ \) | (? < = (^ 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注入。

注:

正文后签名是cpu密集型的。

<?xml version = " 1.0 " encoding = " utf - 8 " ?> < !Citrix Systems, Inc.版权所有保留所有权利。——>               type = "表达" > TEXT.SET_TEXT_MODE (IGNORECASE) .SET_TEXT_MODE URLENCODED .DECODE_USING_TEXT_MODE.REGEX_MATCH (re # (((\ \) | (? < = (^ a-zA-Z0-9_))))(选择|插入|删除|更新| |下降创建|改变格兰特| |撤销|提交|回滚|关闭工会| | | - |相交情况下| | |组解码| |和| |存在明显的开始|添加|修改零|喜欢| | |约束执行| |字符| o执行r|and|sp_sdidebug)((Z)|(?=[^a-zA-Z0-9_]))#)    T    sql Injection         TEXT.SET_TEXT_MODE (IGNORECASE) .SET_TEXT_MODE URLENCODED .DECODE_USING_TEXT_MODE.REGEX_MATCH (re # ((\ \) | (? < = (^ 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_]))#)    T    sql Injection         TEXT.SET_TEXT_MODE (IGNORECASE) .SET_TEXT_MODE URLENCODED .DECODE_USING_TEXT_MODE.REGEX_MATCH (re # ((\ \) | (? < = (^ a-zA-Z0-9_])) (sysobjects | syscolumns | MSysACEs | MSysObjects | MSysQueries | MSysRelationships) ((Z) | (? = [^ a-zA-Z0-9_])) #) < /匹配> < /模式> <模式类型=“fastmatch”> <位置面积= " HTTP_METHOD " / > <匹配类型=“文字”> T > < /匹配    sql Injection        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_]))#)    T    sql Injection