yonyou的一处JNDI审计
审计
映射配置
大概看了一眼流程,可能所有请求都可以利用jndi注入,随便挑一个跟进:
查看处理soapRequest.ajax
请求的SoapRequestAction
类
1 |
|
在execuse
方法中获取了两个参数,ws
、soap
然后将两个参数传进sendRequest
方法,在sendRequest
方法中,会根据传进的ws
参数去查找对应的soap接口服务
传进来的soap参数则作为soap接口参数来进行请求
接下来就找一下能利用的WSDL
IMsgCenterWebService.wsdl
看到一个可疑的参数dataSource
往下跟进查看实现
其接口是IMsgCenterWebService
1 |
|
对应的实现类
1 |
|
但是方法实际调用的是IMsgCenterService
接口的实现
1 |
|
对应的实现类
1 |
|
在uploadAttachment
方法中,将dataSource
、pk_sourcemsg
参数传进resetInvacationInfoByMsgID
方法做处理
在resetInvacationInfoByMsgID
方法中,首先是做了一个初始化,将dataSource
变成变量UserDataSource
的值作为新的数据源以方便下面的流程进行
随后将参数pk_sourcemsg
传进retrieveByPK
方法
1 |
|
在retrieveByPK
方法中,对manager
对象做了初始化,将刚刚设置的新数据源进行加载以供下面调用
跟进createPersistenceManager
方法
注意此处的PersistenceManager.getInstance(ds);
,因为PersistenceManager
是抽象类,所以需要找到继承它的子类来查看对dataSource
的实现
1 |
|
跟进JdbcPersistenceManager
类
1 |
|
在JdbcPersistenceManager
对象中做了一次初始化,此时的dataSource
即是设置的新数据源
进入到init
方法,在init
方法中,又使用JdbcSession
对象来处理dataSource
1 |
|
最终在JdbcSession
的构造函数里对dataSource
进行连接
1 |
|
getConnection
方法
往下就是jdbc的流程了
1 |
|
由于dataSource
参数可控,所以可以向这个参数传入一个恶意的jndi地址就可以进行利用
验证:
根据IMsgCenterWebService.wsdl
构造soap参数
声明:
本文章用于学习交流,严禁用于非法操作,出现后果一切自行承担,阅读此文章表示你已同意本声明。
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.