yonyou的一处JNDI审计

审计

映射配置

image

大概看了一眼流程,可能所有请求都可以利用jndi注入,随便挑一个跟进:

查看处理soapRequest.ajax请求的SoapRequestAction

image

1
SoapRequestAction.class

execuse方法中获取了两个参数,wssoap

image

然后将两个参数传进sendRequest方法,在sendRequest方法中,会根据传进的ws参数去查找对应的soap接口服务

image

传进来的soap参数则作为soap接口参数来进行请求

image

接下来就找一下能利用的WSDL

IMsgCenterWebService.wsdl 看到一个可疑的参数dataSource

image

往下跟进查看实现

其接口是IMsgCenterWebService

1
IMsgCenterWebService.class

image

对应的实现类

1
MsgCenterWebServiceImpl.class

但是方法实际调用的是IMsgCenterService接口的实现

image

1
IMsgCenterService.class

image

对应的实现类

1
MsgCenterServiceImpl.class

uploadAttachment方法中,将dataSourcepk_sourcemsg参数传进resetInvacationInfoByMsgID方法做处理

image

resetInvacationInfoByMsgID方法中,首先是做了一个初始化,将dataSource变成变量UserDataSource的值作为新的数据源以方便下面的流程进行

image

随后将参数pk_sourcemsg传进retrieveByPK方法

image

1
BaseDAO.class

retrieveByPK方法中,对manager对象做了初始化,将刚刚设置的新数据源进行加载以供下面调用

image

跟进createPersistenceManager方法

image

注意此处的PersistenceManager.getInstance(ds);,因为PersistenceManager是抽象类,所以需要找到继承它的子类来查看对dataSource的实现

image

1
PersistenceManager.class

跟进JdbcPersistenceManager

image

1
JdbcPersistenceManager.class

JdbcPersistenceManager对象中做了一次初始化,此时的dataSource即是设置的新数据源

image

进入到init方法,在init方法中,又使用JdbcSession对象来处理dataSource

image

1
JdbcSession.class

最终在JdbcSession的构造函数里对dataSource进行连接

image

1
ConnectionFactory.class

getConnection方法

image

往下就是jdbc的流程了

1
DataSourceCenter.class

image

由于dataSource参数可控,所以可以向这个参数传入一个恶意的jndi地址就可以进行利用

验证:

根据IMsgCenterWebService.wsdl构造soap参数

image

 

 


声明:
本文章用于学习交流,严禁用于非法操作,出现后果一切自行承担,阅读此文章表示你已同意本声明。

Disclaimer:
This article is for study and communication. It is strictly forbidden to use it for illegal operations. All consequences shall be borne by yourself. Reading this article means that you have agreed to this statement.