apache|apacheunomi漏洞介绍及代码分析( 二 )

ElasticSearchPersistenceServiceImpl重写的excute()方法中

看完buildFilter() , 然后接着看eval()count()方法作用不大 , 忽略)
eval()最终回溯到的位置(即入口位置)位于ElasticSearchPersistenceServiceImpl重写的testMatch()方法中
然后只需要找出调用如下两个方法的位置就可以找到完整的调用链
ElasticSearchPersistenceServiceImpl#excute()
ElasticSearchPersistenceServiceImpl#testMatch()

正推分析接下来我开始从请求的入口处开始进行分析
在docker环境中找到了如下jar包
unomi-wab-1.5.1.jar

这个jar包包含了处理web的逻辑 , 其对应着的源码包是
unomi-unomi-root-1.5.1/wab

里面的contextServlet.class对应着我们请求的/context.json
该类继承了HttpServlet类 , 且无doGet()doPost()方法 , 但是有用于处理请求的service()方法


注:service()此方法是接收http-request请求的原始方法 , 请求会发送到这个方法然后才会向doGet()doPost()分发

这里的contextRequest就是我们poc传入的body(可以根据getSessionId等方法以及响应数据判断出来)
接着这里会将contextRequest作为参数传入handleRequest()

接着看到355行

在执行getFilters()后 , 拿到的应该是如下部分



之后进入for循环 , 比较重要的是有一个personalizedContent对象 , 这个类的数据结构如下:

正好对应着我们上图传入的内容
然后跟进359行的personalizationService.filter()方法

注:personalizationService是interface , 我们知道 , 接口不可以实例化 。 但是接口对象可以指向它的实现类对象 。
所以这里的filter()应该是其Impl类的filter()方法 , 所以我们跟进位于源码包
unomi-unomi-root-1.5.1\\services\\src\\main\\java\\org\\apache\\unomi\\services\\impl\\profiles\\ProfileServiceImpl.java

filter()方法

然后跟进67行的profileService.matchCondition()也在同一个源码包下

在781行出现了最关键的persistenceService.testMatch() , 而上半段分析的ElasticSearchPersistenceServiceImpl正好是persistenceService唯一的实现类
至此 , 整个调用链已经打通 , 我们整理一下调用链
调用链整理org.apache.unomi.web.ContextServlet#service() -> org.apache.unomi.web.ContextServlet#handleRequest() -> org.apache.unomi.services.impl.personalization.PersonalizationServiceImpl#filter() -> org.apache.unomi.services.impl.profiles.ProfileServiceImpl#matchCondition() -> org.apache.unomi.persistence.elasticsearch.ElasticSearchPersistenceServiceImpl#testMatch() -> org.apache.unomi.persistence.elasticsearch.conditions.ConditionEvaluatorDispatcher#eval() -> org.apache.unomi.persistence.elasticsearch.conditions.ConditionContextHelper#getContextualCondition() -> org.apache.unomi.persistence.elasticsearch.conditions.ConditionContextHelper#parseParameter() -> org.apache.unomi.persistence.elasticsearch.conditions.ConditionContextHelper#executeScript()

最终被executeScript()
MVEL.executeExpression(mvelExpressions.get(script) context);

【apache|apacheunomi漏洞介绍及代码分析】解析执行