0x00 前言
学了很久的代审基础,终于到审计项目了。在这一阶段,应该要先学习前辈们的经验,同时要有自己的思考与实践。师傅们尝试过的,没尝试过的,都要尝试一遍。
0x01 基础
环境配置
本次审计使用华夏ERP的两个版本,最新版v3.5和老版本v2.3。项目地址:
搭建过程不必多言,麻烦事还是很多的,自行根据报错解决吧。
需要注意的是,v3.5是前后端独立部署的,后端如果没有配置好Redis,前端是收不到验证码的。
审计思路
- 首先要分析项目配置和依赖,如pom.xml、web.xml等,特别是pom.xml,可以从组件中寻找漏洞。
0x02 组件漏洞
Fastjson 反序列化漏洞
先看pom.xml,v2.3的Fastjson版本是1.2.55,v3.5的版本是1.2.83。前者存在漏洞,后者目前不存在漏洞。
关键字parseObject,限定目录为controller:

这里很多选项都可以攻击,就不一一列举了。parseObject(search)是最明显的;可能有些人会对parseObject(beanJson, Class)类型的产生怀疑,觉得不可行,也没有去多尝试。事实上,这也是可行的。这个项目没有对参数做检测,只要第一个参数是可控的,就可以进行攻击,不需要在乎第二个参数。
所以代码审计的一个基本素质,就是多尝试,多思考。
仅仅这样,就够了吗?我还没有探索为什么parseObject(beanJson, Class)也可以。
······ 探索了一段时间,没搞明白,以后再说。
Log4j2尝试
2.3版本的Log4j2依赖:

这个版本存在漏洞,但是该项目实际上并不是使用Log4j2管理日志,而主要是Logback,em,乱得很。3.5也一样。
但是,关于组件漏洞,我还是获得了一些收获:
- 先确定组件版本,了解对应漏洞
- 观察漏洞所在功能点是否被使用,或者说组件是否得到应用(这很反直觉,难道添加了组件不去用?)
- 构造payload,尝试攻击
第二点看起来很反直觉,但是该erp就是这种情况。它用到了Log4j2,但是桥接给了Logback,日志系统本质上还是Logback处理,所以这里Log4j2相关的漏洞就不存在了。
Filter鉴权漏洞
v2.3,该项目只有一个Filter:LogCostFilter,用于判断用户是否登录。
下面的几个判断只要满足其一即可
首先找会话session里的userinfo:
再判断url是否包含/doc.html*或者/register.html*或者/login.html*:
再判断是否是访问静态资源:

最后判断是否是允许的路由:
具体的代码请读者自行去看,这里的重点是如何绕过这些判断,使得我们在非登录状态下可以访问任意路由和资源。
第一个判断是从session里面拿,不知道绕过方法。
第二个判断的关键在于contains方法,该方法会判断url里是否存在给定的参数字符串,很容易绕过:
第三个判断如下绕过:
最后一个判断采用第二个判断的绕过方法即可。这些都是基本的URL绕过技巧。
现在我们可以在非登录状态下访问任意路由,正好/user/getAllList路由会爆出所有用户的信息: