问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
漏洞挖掘之再探某园区系统
漏洞分析
上次提到还有一处可能存在任意用户登录的点,最近没什么研究就写一下,顺便看看还有其他漏洞不
漏洞挖掘之再探某园区系统 ============ 上次提到还有一处可能存在任意用户登录的点,最近没什么研究就写一下,顺便看看还有其他漏洞不 0x01 任意用户登录 ----------- ### 1、漏洞分析 通过上次提到的搜索new UserBean()的思路,发现还有一处创建用户的方法 ```java public void addUser(WsAdminParam<ExUserBean> adminParam) { ExUserBean bean = (ExUserBean)adminParam.getParam(); UserBean userBean = new UserBean(); userBean.setOwnerCode(bean.getOrgCode()); userBean.setRoleIds(bean.getRoleIds()); userBean.setLoginName(bean.getLoginName()); userBean.setIsReuse(bean.getIsReuse() ? 1 : 0); userBean.setLoginPass(bean.getLoginPass()); userBean.setUserName(bean.getUserName()); userBean.setUserType(0); this.userManager.addUser(userBean); UserCache.addUserToUserList(userBean); } ``` 可以看到通过传入WsAdminParam类型参数,获取param对象的成员遍历对UseBean进行赋值初始化,最后保存到数据库中 接下来就是找哪里调用了addUser这个方法,根据前面我们发现调用都是`接口.方法名`,于是构造ExUserManager.addUser  并没有其他调用,难道这只是单纯实现了方法? 扩大搜索面只搜索`ExUserManager`接口名,排除类定义等干扰信息我们有了新的收获 ```java interfaceMethodsMap.put(AdminWebService.INTERFACE_QUERY_USER,WsMethod.bulid(ExUserManager.class.getMethod("queryUser", WsAdminParam.class), ExUserBean.class)); interfaceMethodsMap.put(AdminWebService.INTERFACE_DELETE_USER,WsMethod.bulid(ExUserManager.class.getMethod("deleteUsers", WsAdminParam.class), ExUserBean.class)); interfaceMethodsMap.put(AdminWebService.INTERFACE_ADD_USER,WsMethod.bulid(ExUserManager.class.getMethod("addUser", WsAdminParam.class), ExUserBean.class)); interfaceMethodsMap.put(AdminWebService.INTERFACE_VIEW_USER,WsMethod.bulid(ExUserManager.class.getMethod("viewUser", WsAdminParam.class), ExUserBean.class)); interfaceMethodsMap.put(AdminWebService.INTERFACE_UPDATE_USER,WsMethod.bulid(ExUserManager.class.getMethod("updateUser", WsAdminParam.class), ExUserBean.class)); interfaceMethodsMap.put(AdminWebService.INTERFACE_UPDATE_USER_PASSWORD,WsMethod.bulid(ExUserManager.class.getMethod("updateUserPassword", WsAdminParam.class), ExUserBean.class)); ``` 在AdminWebServiceImpl类的静态代码块中初始化了interfaceMethodsMap数组,其中将`ExUserManager`方法对象进行存储。 在`executeInterface`方法中对interfaceMethodsMap数组进行了取值操作  假设我们想调用addUser这个方法需要指定`interfaceMethodsMap`的key为`admin_011_02`(下面会讲到),map会返回我们`WsMethod`对象,那么`WsMethod#getExtClass`返回的值就是map中的 `WsMethod.bulid` 的第⼆个参数,也就是`ExUserBean`  `WsAdminParam.fromJson(jsonParam, method.getExtClass());`⽅法如下:这⾥将我们传⼊的第⼆个参数⾸先进⾏json解析,移除json中的param参数,然后再分别进⾏json反序列化,第⼀次反序列化是将移除的param json数据转化为`ExUserBean`类型,第⼆次反序列化是将 传⼊的json转化为 `WsAdminParam` 类型,最后将`ExUserBean`重新设置到 `WsAdminParam` 对象中,因此我们传⼊的参数主要是在反序列化为 `WsAdminParam` 对象  观察 `WsAdminParam` 类成员变量,发现需要这些参数:  那我们在`executeInterface`方法中传入的jsonParam的值应为: ```json { "authorinize": { "userName": "11", "password": "11", "loginCode": "11" }, "locale": "1", "param": {"orgCode":"001","loginName":"test","roleIds":"1","loginPass":"test","isReuse":0,"oldLoginName":"xxx","oldRoleIds":"1","userName":"test"}, "paramStr": "11", "langLocale": "11", "orders": [{"propertyName": "1","isAscending": true}] } ``` 其中param对应了初始化ExUserBean对象的变量值  那么executeInterface方法在哪调用呢? 我们发现AdminWebServiceImpl类注解为@WebService ```java @WebService( targetNamespace = "http://webservice.dhsoft.com" ) public class AdminWebServiceImpl implements AdminWebService ``` > WebService是一种跨编程语言和跨操作系统平台的远程调用技术。 > > 所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然!跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。 > > Java中常用注解来注册WebService服务,常见注解有 > > @WebService:此注示用来标明此java类为某个WebService的实现类或者标明此java接口定义了某个WebService的接口。即定义服务 > > @WebMethod:定义方法,在公共方法上面表示该方法要作为服务发布,仅支持在使用@webservice注解来注解的类上使用@WebMethod注解 > > @WebResult:注解用于定制从返回值至 WSDL 部件或 XML 元素的映射。即定义返回值 > > @WebParam: 注解用于定制从单个参数至 Web Service 消息部件(message元素)和 XML 元素的映射。即定义参数 向上进入AdminWebService接口  其中定义了interfaceMethodsMap数组interfaceId的具体值,我们调用addUser时interfaceId=admin\_011\_002;并且将executeInterface注册在了WebService服务中。 根据java中WebService的配置,我们在配置文件中找的AdminWebService注册的路由(厚码保命)  而在web.xml中WebService服务是由CXFServlet来处理的  此时路由并没有配置拦截器可以未授权访问。  ### 2、漏洞复现 我们利用burp中的插件Wsdler帮助我们生成webservice的xml格式 首先访问该seervice的wsdl  随后burp抓取该请求包,并parse wsdl  随后在插件中得到请求格式  我们把前面构造的两个参数带入到请求包中,成功创建用户  并使用该用户登录到后台  0x03 其他利用点 ---------- 我们对比两个添加用户的方法发现构造完userbean对象后都调用了`this.userManager.addUser`方法,我们可以精确搜索  发现还有其他两个接口可以创建用户。 而在`AdminWebServiceImpl`的`interfaceMethodsMap`中除了`adduser`还有其他方法  比如`queryUser`可以查看用户信息  `viewUser`可以查看对应用户的密码  另外在lib中看到低版本的xstream依赖  xstream主要是在调用fromXML和toXML方法如果传入参数可控就大概率存在反序列化漏洞 利用jar-analyzer工具快速找出项目中调用相关方法的位置  挑选addDevs方法,找的具体实现的代码  这里`getFormatedDevXStream`是获取XStream对象  如果`validateAndReturnXmlInfo`方法的返回可控就可以进行反序列化,跟进发现   可以看到`validateAndReturnXmlInfo`其实是获取请求参数`xmlInfo`的值,这个我们是可控,构造payload。 这里使用woodpecker插件进行XStream Payload的生成(工具地址:[https://github.com/woodpecker-framework/woodpecker-framework-release;插件地址“https://github.com/woodpecker-appstore/xstream-vuldb](https://github.com/woodpecker-framework/woodpecker-framework-release%EF%BC%9B%E6%8F%92%E4%BB%B6%E5%9C%B0%E5%9D%80%E2%80%9Chttps://github.com/woodpecker-appstore/xstream-vuldb)”)  复制出来去除缩进的空格和换行后将其进行URL全编码,访问接口并传参  成功执行ping命令
发表于 2024-06-28 10:50:20
阅读 ( 37062 )
分类:
漏洞分析
0 推荐
收藏
2 条评论
1521
2024-06-30 22:00
那个搜索文本的工具是什么啊?
请先
登录
后评论
c铃儿响叮当
2024-12-02 14:37
那个搜索文本的工具是什么啊?
请先
登录
后评论
请先
登录
后评论
中铁13层打工人
79 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!