1. IAST与RASP的区别
1.1 IAST
使用Agent探针,监测字节码,agent判断是否触发风险函数,记录漏洞数据。
1.2 RASP
使用Agent探针,监测受到攻击时,修改字节码(插桩),直接抛出异常,做拦截功能。
1.3在Agent中应用的区别
IAST在受到攻击时对传播链路的记录与查看
RAST在受到攻击时直接在入侵点做字节码修改,拦截处理攻击
2. 漏洞检测原理
2.1 污点跟踪处理
流量Http、污染源Source、传播Propagator、漏洞触发Rule
2.1.1 污点传播举例
Http流量开始 -> Source点触发 -> Rule点触发 -> 流量结束 => 发现漏洞
(没有传播过程)
Http流量开始 -> Source点触发 -> Propagator传播点1 … Propagator传播点n -> Rule点触发 -> 流量结束 => 发现漏洞
(有传播过程)
2.2.2 污点传播流程
用户访问被测应用,agent监听上下文=>当执行到Source中的风险函数时,就把所有的参数打做污点=>查看污点的propagators 传播链=>是否做了tag 中的安全过滤=>走完流程,判断rules漏洞是否有不被允许的安全过滤,如果有就说明该漏洞的该入侵点被修补了,如果不被允许的安全过滤全部执行,那么该漏洞就不存在,该数据就不是污染数据。
2.2.3 数据解析
Http节点
在java中,Filter中的doFilter方法就可以作为Http节点,通过其不仅可以监控整个请求的生命周期(开始到结束),还能获取请求与响应的内容,java中就使用Filter作为Http节点
Source节点
获取外部数据的方法即可视为Source节点,Source点的返回值都称为污点数据
例子:
1 | request.getQueryString() // 获取请求的QueryString |
Propagator节点
传播节点可以是字符串拼接函数,污点数据经过传播函数后可能使数据被改变,但该数据仍然具有攻击性,所以需要设置一个传播节点,避免污点数据在程序中流动时无法持续跟踪
例子:
1 | String data = request.getQueryString(); // 获取外部数据,假设数据为 " rm -rf /" |
Rule节点
规则触发点、危险函数点就是Rule节点
如:执行系统函数的方法、写入响应体的方法,执行SQL语句的方法,都可以作为Rule节点,不同的Rule节点代表着不同的漏洞类型
例子:
1 | Runtime.getRuntime().exec(xxx) // 执行系统函数,触发命令注入漏洞 |
2.2 流量匹配
流量匹配漏洞大多都是规则漏洞且大多都是低风险漏洞
流量是指一个外部请求产生的请求及响应内容。
对请求体及响应体进行规则检查而判断的漏洞。
如:
- 不充分的SSL连接:通过判断其请求是否为https协议,低危漏洞
- Content-Type头缺失:检查响应包的Header中是否缺失Content-Type头,低危漏洞。
- 会话Cookie中缺少secure属性:验证Cookie是否设置Secure标识,低危漏洞。
2.3 环境扫描
环境扫描的漏洞大多都是规则漏洞且大多都是低风险漏洞
主要是对Web应用源码或配置进行检查,很类似于代码审计
如:
- 硬编码密码:检查程序中是否存在在代码中写死的密码,低危漏洞
- 数据库连接弱口令:检查数据库连接的密码是否过于简单,如admin、123456,低危漏洞
- PHP版本泄漏:验证用户配置文件中是否将expose_php字段设置为On,这将会导致所有请求中附带PHP版本信息,低危漏洞。
2.4 采样、去重、拆分
流量采样
在单位时间内对相同URL的请求做有限的检测,避免同一接口高并发情况下影响被测应用性能,存在漏洞的情况下还会导致漏洞重复检测
漏洞去重
与流量采样有异曲同工之妙,但是阶段不同,漏洞去重发生在漏洞被检测到之后。不同的漏洞类型,按照不同的规则,使用不同的去重算法。
功能简介 :对一定时间内相同的请求进行过滤
去重算法 :
- 首先根据 ruleId 取出对应的配置
- 根据配置将需要的值(为Y的值)取出放到数组中,为N的置NULL
- 将数组生成一个唯一key作为去重的依据
- key第一次出现则放行
- key距离上一次未超过
<interval>
秒则去重 - key超过
<interval>
秒则放行
去重配置 :
1 | {"200", "N", "Y", "Y", "Y", "N", TEN_SECOND} |
漏洞拆分
一个流量进来,其中的一个或多个污染数据可能会产生多个漏洞,此时要将它们在污点跟踪过程中的各个阶段进行整理判断,将与其相关的各个节点整合成。
可以把污点跟踪的漏洞的过程想象成一个多叉树结构,将一个漏洞的触发点Rule视为根节点,把叶节点视为Source点,非叶节点视为传播节点,存在的每一条根节点到叶节点的路径即可拆为一条漏洞。
情况较多且复杂,而且耗资源,每个节点都可能被复制很多份
拆分方法可分为:
单污染源单漏洞:不用拆分直接上报
单污染源N个漏洞:拆分成N个漏洞上报
M个污染源N个漏洞:拆分成M*N个漏洞上报
M个污染源1个漏洞:上报1个漏洞