0x00 前言
本文主要记载WEB组件漏洞分析方法,包括漏洞信息搜集,补丁分析,PoC编写,修复方案等内容。以总结无PoC,Exp的Nday漏洞的验证手段。
0x01 信息搜集
漏洞信息的搜集有四种组件官方网站,Github,NVD等漏洞数据库,公众号或技术博客等第三方平台。
1.1 官方网站
一般情况下,被广泛使用的组件会有官方网站,其网站上会对历史漏洞进行记录,记录会包含漏洞编号,漏洞影响版本以及修复的commit。
1.2 Github
开源组件在Github上可以下载历史版本,并且可以看到commit的具体内容,也就是所谓的补丁,依此可以逆推出漏洞成因,以便编写PoC。
并且Github上搜索漏洞编号可能会出现PoC或exp。
1.3 NVD
NVD有用的信息有漏洞描述,漏洞评分,第三方链接,CWE-ID,从漏洞描述和CWE-ID可以看出该漏洞是什么类型,部分描述可以看出漏洞产生的文件,函数或者原因,第三方链接可能连接到了利用链接,修复通告。
1.4 第三方平台
可以从微信公众号,Twitter,谷歌搜索CVE编号。可能会存在漏洞复现相关文章或者相关PoC。
0x02 补丁分析
补丁分析的本质是代码审计,以漏洞CVE-2021-35515为例发现其补丁是对于数组的成员进行了一个校验,而漏洞本身是一个无限循环漏洞,可以猜想,其漏洞成因可能是该while循环会无限制的迭代。因此我们需要构造使得其无限循环的数据。
观察代码,想要该循环无线循环就需要让current恒>=0,且current不能一直增长,所以current最好能恒=0。根据current的赋值代码,我们只要让bindPairs[pair].inIndex恒等于0即可。
final int pair = findBindPairForOutStream(current);
current = pair != -1 ? (int) bindPairs[pair].inIndex : -1;
0x03 PoC编写
为了验证漏洞的存在,还需要进行PoC的编写,部分漏洞是由于一个函数产生的,此时将构造好的数据传入漏洞函数便可以验证效果。其详细步骤大概分为以下几步:
- 编写调用漏洞函数的Java代码
- 部分需要HttpServletRequest等Servlet实现的代码可以使用JUnit来写测试用例验证
- 大部分可以直接传入恶意参数给漏洞方法
- 一些无关漏洞的验证如CRC可以直接修改数据跳过
- 创建同名文件可以进行源码Patch
- 执行该Java文件并传入构造好的恶意数据
- 查看效果
不同的漏洞产生的效果不同,对于Java反序列化,XXE或是任意的命令执行漏洞,可以通过touch命令创建文件,calc命令弹出计算器,访问dnslog生成的网址来判断命令执行是成功。
对于DoS等拒绝服务的漏洞可以通过调用函数查看是否Java出现异常来判断。如下是一个内存耗尽漏洞的报错案例。
对于无限循环的漏洞可以通过进行源代码Patch,使用一个参数Count记录代码的执行次数,执行次数过大的时候显然是异常的。也可以调试进行逻辑分析,观察循环过程中的变量情况,推理是否存在无限循环漏洞。
0x04 修复方案
修复方案通用的便是将漏洞版本的组件提升至漏洞不存在的版本,修复版本一般可以从nvd或组件官网上得知。
其次对于需要通过WEB服务利用的漏洞,可以通过流量测进行检测,对传输的数据包进行一些过滤,如对于反序列漏洞的利用,其流量数据中会存在一些利用链使用到的类的字符,使用WAF,IPS对其进行过滤也可以防止漏洞的利用,当然这只是缓兵之计,重要的还是要从源码层面进行修复。
当官方没有对已有的漏洞进行修复,也就是不存在修复版本的时候,就需要手动对代码进行Patch,这里分为两种情况,第一在调用漏洞函数的时候对传入的参数进行一次过滤,第二是对组件代码进行一些修改在其内部函数进行一些过滤处理(这也是模拟官方修复漏洞的过程)。
文章评论