在复现jeecg历史漏洞时发现了一基于jeecg框架仓库系统,故在此记录一下审计过程。
查看src/main/webapp/WEB-INF/web.xml
文件看到提供了三种路由形式.do
、.action
和/rest/
这里没有用于权限认证Filter
查看/src/main/resources/spring-mvc.xml
可以看到定义了四个interceptor
主要是设置请求包和响应包的编码格式
跟进方法,发现注释掉了原有处理流程直接返回true
该拦截器的mapping为/**
,即处理所有请求,根进到具体实现
该拦截器的mapping也为/**
,查看具体实现
我们通过上述分析,发现处理鉴权操作的仅是AuthInterceptor
和WmsApiInterceptor
两个类。
首先我们来分析AuthInterceptor
类:
在spring-mvc.xml
中,对AuthInterceptor
类的excludeUrls
和excludeContainUrls
两个成员变量做了初始化:
我们来到AuthInterceptor
类鉴权方法preHandle
的具体实现:
可以看到当url中包含rest/
或者excludeUrls
和excludeContainUrls
数组里的字符串时直接返回true放行请求。
正常访问后台接口返回302:
我们可以用rest/
和wmOmNoticeHController.do
来bypass:
WmsApiInterceptor
类:
跟进到prehandle
方法实现:
当请求url在containUrls列表中时进入if处理逻辑:
1.获取header中Authorization
的值
2.利用jwtUtils
解析Authorization
3.当解析后的值等于wmsAccount
时放行
而JwtUtils
硬编码了jwt密钥
我们可以利用密钥自己构造Authorization
为wmsAccount
来bypass,这里就不赘述了。
根据README和pom.xml发现其是使用Hibernat
框架进行sql。我们可以通过搜索Hql相关查询语法,如:session.createQuery
,Restrictions.sqlRestriction
等关键字,或是对有关数据查询等功能点抓包找到接口具体实现跟进。
这里我们通过关键字搜索到了HQL实现类src/main/java/xx/xx/xx/extend/hqlsearch/HqlGenerateUtil
,其中installHql
方法调用了Restrictions.sqlRestriction()
进行查询。
方法主要获取sqlbuilder
参数的值(数据结构为json)进行sql查询。搜索其用例发现在用户查询功能处调用了其方法
于是我们对其功能点进行抓包
发现传参中存在sqlbuilder
,不过前端代码sqlbuilder
被隐藏掉了。
于是我们再看HqlGenerateUtil:installHql()
的实现,其中获取到sqlbuilder
的值后通过JSONHelper:toList()
转化成QueryCondition
类型对象存入列表中。而QueryCondition
类有如下成员变量:
随后通过getSql()方法将遍历list和searchObj两对象的成员变量拼接成最终查询的SQL字符串。下面是getSsql方法的实现。
当执行到sb.append(tab+c)
时会调用QueryCondition
类的toString
方法:
可以看到其对QueryCondition的成员变量进行拼接最后根据this.type的值确定this.value的拼接方式。
于是我们构造payload为
sqlbuilder=[{"field":"createName","type":"string","condition":"is not null and user() like '%25r%25' and '1' like ","value":"%251%25","relation":"and"}]
最终的SQL字符串为
1=1 and create_name is not null and user() like '%r%' and '1' like '%1%'
最后配合前面的权限绕过可达到未授权SQL注入
79 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!