一、编程语言的要素

天存信息的iWall3应用防火墙是一种创新式的类编程 WAF,它包含了编程语言的一些基本要素。

1. 变量

iWall3 中广义的变量包括报文变量、环境变量和用户变量:报文变量和环境变量相当于编程语言中的常量或传入的参数,用户变量则是真正编程语言意义上的变量,即用户可以自行创建、使用和维护变量。

2. 条件判断

iWall3 支持编程语言标准的条件判断:即可以包含无限嵌套if - then - else 条件,每个 if 条件又可以使用 and - or - not 逻辑运算符连接多个子条件。

3. 表达式

iWall3 支持与通用编程语言一致的表达式:表达式由常量、变量、运算符和内置函数组成,以模板字符串方式内嵌书写,可在条件判断、变量赋值、模式匹配、日志输出等任意位置使用。

4. 语句

条件执行部分,iWall3 允许用户书写任意语句:这些语句不限于 WAF 常规的阻止访问和记录日志,它可以实现更复杂的功能,如:改变其他规则的行为,修改 HTTP 报文的特定部分,输出指定变量等。

二、数据方式的语言表达

天存信息的 iWall3 包含了编程语言的设计思想,但独创性地以数据方式呈现。

1. JSON格式

安全产品的使用者通常是非程序员,他们习惯于面对配置文件而非一段代码。因此,iWall3 的配置依旧以规则文件的形式出现,只是这里的规则不是纯文本格式,而是可以体现出层次结构的 JSON 格式。

  • 充分利用 JSON 格式的名-值对 (对象) 和序列表 (数组) 结构,将语言要素和业务逻辑用 JSON 格式表达出来,兼顾规则的人机可读性和高度灵活性。
  • JSON 格式的每个元素都具有明确的名 (name),这就给了书写者一个基本的框架和自说明的参数指引,既方便了自己书写规则,也便于其他人对规则的维护。
  • iWall3 规则具有明确细致的语法定义,从而能够使用成熟的 JSON schema 方式来校验 (validate) 规则的正确性,例如可以细致检查动作的必选参数、可选参数以及拼写错误。

2. 规则结构

一个规则即为一个 if-then-else 结构,在 JSON 格式中表现为一个名为 if 的对象和一个名为 then 的对象,以及可选的一个名为 else 的对象——

  • if - 变量经选择和整形后,与表达式模式的运算进行匹配。支持用逻辑运算符连接多个条件。
  • then - 匹配后执行的一般语句和裁决语句,还可以包含子 if-then 结构。
  • else - 不匹配时执行的语句和可选的子 if-then 结构。

以下是规则的一个举例:

{
"if": {
"variable": "REQUEST_FILENAME_EXT",
"operator": "inFromFile",
"pattern": "restricted_file_exts.lst"
},
"then": {
"if": {
"variable": "REMOTE_ADDR",
"operator": "begin",
"pattern": "192.168"
},
"then": {
"verdict": {
"log": true,
"action": "pass"
},
"actions": [{
"action": "alterArgGet",
"op": "set",
"name": "iwall_rule_id",
"value": "${RULE.id}"
}],
},
"else": {
"verdict": {
"log": true,
"action": "deny"
}
}
}
}

上述规则实现的功能为: 遇到访问敏感文件类型时,记录日志,并对不同访问来源作不同响应:来自内网的,放行且将规则 id 作为参数传给后端应用;来自外网的,则拒绝。

3. 自动循环

一般编程语言中都有名为 for 的循环语句,用来对可迭代数据进行逐个元素处理。HTTP 协议中的请求参数 (args)、头 (header) 都是可迭代数据,在 iWall3 中表现为集合或者数组的数据类型。如果按照编程语言的惯例,用 for 循环去显式地获取数据,会让规则写得很繁琐。

iWall3 则实现了对可迭代变量类型的自动循环,只需列出变量名,即可自动进行循环迭代,简化了书写。而对于不需要参与循环的元素,也提供了成员筛选的手段,直接在变量名后列出白名单或黑名单成员即可。

{
"if": {
"variable": "REQUEST_COOKIES:!cnzz_*",
"transform": "urlDecodeUni",
"operator": "detectSQLi"
}
}

上述规则对请求 cookie 中的每个成员进行 SQL 注入检查,但排除掉 cnzz_ 开头的成员。

4. 动态修改

规则并非是静态孤立的,它不仅可以自身执行动作,还可以在 HTTP 会话过程中去改变其他规则的属性,称为元属性覆写。元属性覆写功能实现了运行时的检测和动作分离,通过动态调整其他规则的输入和响应,满足用户复杂的需求。

{
"if": [{
"variable": "REQUEST_FILENAME",
"operator": "=",
"pattern": "admin.php"
},
{
"variable": "TIME.hour",
"operator": "<",
"pattern": "8"
}],
"then": {
"actions": [{
"action": "alterRuleMeta",
"rules": "10001,30001-30999",
"meta": {
"severity": "warning",
"abnormal_weight": 15
}
}]
}
}

上述规则的功能是: 在 0:00am-8:00am 这一时间段内访问 admin.php 时,部分规则的紧急度将被设为 critical,异常权值则被设为 15。

三、针对HTTP协议的定制

天存信息的 iWall3 的目标是实现 Web 应用防护,因此在语言设计上也有与 HTTP 协议密切相关的因素。

1. 数据类型

与编程语言中的变量一样,iWall3 的变量也具有多种数据类型。其中有些数据类型是专门针对 HTTP 协议而设计的,如:

集合类型 结构类型
允许同名的成员。HTTP 协议允许出现同名的请求参数和头,用集合类型来体现名-值对而非键-值对。 允许使用 XPath 和 JsonPath 来指定元素,对 XML 和 JSON 类型的请求数据能够更精细地处理。

2. 持久变量

iWall3 的用户变量具有自己的生命期。在语言层面,iWall3 不仅提供了 HTTP 会话期内有效的事务内变量,也提供了跨越 HTTP 会话的持久变量。

持久变量提供了跨越 HTTP 事务的保存、计算和读取数据的机制。这样,Web 应用防护的逻辑就不局限于单个 HTTP 会话,而是可以在多个 HTTP 会话间建立联系。

3. 状态维护

HTTP 协议本身是无状态的,这意味着没有“用户”的概念。但在防护功能上,我们又需要有一个“用户”的概念,这样才能将多个 HTTP 事务关联起来,制定针对“用户”的防护措施。

iWall3 提供了主体的概念,它是 HTTP 事务的发起端和访问者。对于每个 HTTP 事务,可以从设备、网络和报文等不同层面采集信息,得到多个类型的主体。如此,书写者能够对多个 HTTP 事务中的同一主体应用规则 (如长时间拦截) 和共享数据 (如权重计算)。

四、有什么用

使用类编程 WAF,安全人员不再是规则的使用者,而变成了规则的生产者。针对应用的细致和独立的安全需求,基本上都可以用编程的方式实现出来,不再受限于 WAF 产品提供的内置功能。

如本文开头所述的功能需求,即使仅仅在防范注入方面:

  • 某个域名或某些特定的 URL 不需要注入检查;
  • 对来自外网的注入访问进行拦截,来自内网的注入访问只记录,不拦截;
  • 对特定的请求参数名或特定特征的请求参数不进行注入检查;
  • 非工作时段不仅拦截还阻止该用户一段时间访问;
  • 对 admin 等管理账号登录后的访问不进行注入检查;
  • 对于只记录不拦截的请求,附加一个特别的请求头发往应用;
  • 对某些 URL 的注入访问,记录下 HTTP 请求的全部报文;
  • HTTP 响应码为 500 的注入的日志紧急度设为 alert;
  • 对疑似的注入企图不做一次拦截,而是进行加权计算。

无论是上述某一条还是更复杂的组合,安全人员都可以在用户现场通过高度灵活的类编程 iWall3 来实现。

类编程的WAF(下)的更多相关文章

  1. 类编程的WAF(上)

    一.复杂的需求 WAF (WEB 应用防火墙) 用来保护 WEB 应用免受来自应用层的攻击.作为防护对象的 WEB 应用,其功能和运行环境往往是复杂且千差万别的,这导致即便防御某个特定的攻击方式时,用 ...

  2. C++ Primer 学习笔记_69_面向对象编程 --继承情况下的类作用域

    面向对象编程 --继承情况下的类作用域 引言: 在继承情况下,派生类的作用域嵌套在基类作用域中:假设不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义. 正是这样的类作用域的层次嵌套使 ...

  3. JAVA编程规范(下)

    JAVA编程规范(下) 2016-03-27 6. 代码的格式化 6.1 对代码进行格式化时,要达到的目的 1.     通过代码分割成功能块和便于理解的代码段,使代码更容易阅读和理解: 2.     ...

  4. Python进阶开发之元类编程

    系列文章 √第一章 元类编程,已完成 ; 本文目录 类是如何产生的如何使用type创建类理解什么是元类使用元类的意义元类实战:ORM . 类是如何产生的 类是如何产生?这个问题肯定很傻.实则不然,很多 ...

  5. python3 元类编程的一个例子

    [引子] 虽然我们可以通过“class”语句来定义“类”,但是要想更加细粒度的控制“类”的创建,要使用元类编程才能实现. 比如说我们要实现这样的一个约束.所有项目中用到的类都应该要为它定义的方法提供文 ...

  6. 【Windows】windows核心编程整理(下)

    windows核心编程整理(上) windows核心编程整理(下) 线程的堆栈 每当创建一个线程时,系统就会为线程的堆栈(每个线程有他自己的堆栈)保留一个堆栈空间区域,并将一些物理存储器提交给这个以保 ...

  7. Python元类编程

    来源:http://python.jobbole.com/88582/ @property装饰器,是将类中的函数当做属性调用 Python类中定义的属性,如果属性名前面只有一个下划线,那么就是一种规范 ...

  8. PythonI/O进阶学习笔记_7.python动态属性,__new__和__init__和元类编程(上)

    content: 上: 1.property动态属性 2.__getattr__和__setattr__的区别和在属性查找中的作用 3.属性描述符 和属性查找过程 4.__new__和__init__ ...

  9. python的元类编程

    廖雪峰的python教程有python元类编程示例,综合代码如下 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df ...

随机推荐

  1. iwrite复制攻略

    打开iwrite,一提交作业,发现: 这可咋办啊! 那就跟着步骤来呗: 按F12打开元素审查 点一下左上角 再点一下文本框,就能定位到HTML中的位置 在文本框中写几个字母,康康具体位置: 那就复制进 ...

  2. 【python】Leetcode每日一题-扁平化嵌套列表迭代器

    [python]Leetcode每日一题-扁平化嵌套列表迭代器 [题目描述] 给你一个嵌套的整型列表.请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数. 列表中的每一项或者为一个整数,或者是另 ...

  3. 一个或多个listeners启动失败,更多详细信息查看对应的容器日志文件

    碰到这个问题很多次,每次碰到都是去百度找.但是,不尽人意,好在最后还是解决了,所以写下总结. 报错内容: org.apache.catalina.core.StandardContext.startI ...

  4. 测试的V模型和W模型

    V模型 :后测试 优点: 1.每一阶段都清晰明了,便于把控开发的每一个过程. 2.既包含了单元测试又包含了系统测试 缺点: 1.测试介入的比较晚,所以开发前期的缺陷无从修改. 2.开发和测试串行. W ...

  5. MySQL关于日期为零值的处理

    前言: 前面文章我们介绍过日期和时间字段的查询方法,最近遇到日期值为零的问题.原来了解过和 sql_mode 参数设置有关,但还不是特别清楚,本篇文章将探究下MySQL怎么处理日期值为零的问题. 1. ...

  6. 图扑软件正式加入腾讯智维生态发展计划,智能 IDC 开启数字经济新征程

    4 月 23 日,主题为<智汇科技,维新至善>的腾讯数据中心智维技术研讨会在深圳胜利召开,发布了腾讯智维 2.0 技术体系,深度揭秘了智维 2.0 新产品战略和技术规划.图扑软件(High ...

  7. Windows 程序自动更新方案: Squirrel.Windows

    Windows 程序自动更新方案: Squirrel.Windows 1. Squirrel Squirrel 是一组工具和适用于.Net的库,用于管理 Desktop Windows 应用程序的安装 ...

  8. Java集合详解(二):ArrayList原理解析

    概述 本文是基于jdk8_271版本进行分析的. ArrayList是Java集合中出场率最多的一个类.底层是基于数组实现,根据元素的增加而动态扩容,可以理解为它是加强版的数组.ArrayList允许 ...

  9. docker中运行envoy 报错 cannot bind '0.0.0.0:80': Permission denied

    docker-compose文件 version: '3' services: envoy: image: envoyproxy/envoy-alpine:v1.15-latest volumes: ...

  10. 搞清楚 硬件环境 os环境 网络环境 搞清楚测试工具 测试步骤 自己搭测试环境 自测

    1,遇事的第一反应要从变化情绪转变为做出判断.判断什么?判断这一件事对自己是否重要,是否关乎我的个人利益,是否影响我的人际关系等等等等.如果答案都是否,那就没必要着急忙慌了.如果答案是是 冷静,其实是 ...