漏洞挖掘之再探某园区系统

admin 2024年7月2日15:57:20评论2 views字数 4485阅读14分57秒阅读模式
文章来源: https://forum.butian.net/share/3100

漏洞挖掘之再探某园区系统

上次提到还有一处可能存在任意用户登录的点,最近没什么研究就写一下,顺便看看还有其他漏洞不

0x01 任意用户登录

1、漏洞分析

通过上次提到的搜索new UserBean()的思路,发现还有一处创建用户的方法

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接口名,排除类定义等干扰信息我们有了新的收获

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的值应为:

{
 "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

@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方法,我们可以精确搜索

漏洞挖掘之再探某园区系统

发现还有其他两个接口可以创建用户。

而在AdminWebServiceImplinterfaceMethodsMap中除了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”)

漏洞挖掘之再探某园区系统

复制出来去除缩进的空格和换行后将其进行URL全编码,访问接口并传参

漏洞挖掘之再探某园区系统

成功执行ping命令

声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。

原文始发于微信公众号(白帽子左一):漏洞挖掘之再探某园区系统

 

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年7月2日15:57:20
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   漏洞挖掘之再探某园区系统https://cn-sec.com/archives/2909915.html

发表评论

匿名网友 填写信息