记一次渗透测试CS架构产品客户端创建用户机制抓包,通过peach工具重放报文绕过客户端直接创建用户的问题定位。

1、背景

该产品基于CS架构设计,可以通过管理员账户客户端创建系统用户。首先通过wireshark抓取了登陆到创建用户的整个报文,并将报文解密,配置peach发包工具,模拟管理员登陆客户端并创建其他用户的功能。

2、现象

当管理员用户在线的时候,peach工具能够成功发包创建用户。而管理员用户不在线时,peach工具发包无法创建用户。也就是说peach工具复用了已经登陆成功的管理员用户session。

3、登陆机制

用户登陆成功后,会在服务端创建session保存用户信息,并将sessionId分别存入服务端InheritableThreadLocal和ThreadLocal两个字段,将session缓存在服务端,并将session作为返回值返回客户端,更新客户端的sessionId.  

4、问题定位

客户端RMI调用的时序如图所示:

记一次渗透测试CS架构产品客户端创建用户机制抓包,通过peach工具重放报文绕过客户端直接创建用户的问题定位。_第1张图片

客户端通过RMI方式调用服务端接口,首先会获取客户端本地sessionId,封装到Spring ContextRemoteIncation中,服务端在执行invoke方法调用前,会将客户端发送过来的contextRemoteInvocation导入线程自身的InheritableThreadlLocal,触发拦截器调用,首先会通过拦截器进行拦截处理,从线程自身的InheritableThreadLocal中取出sessionId,再根据sessionId从服务端缓存中获取session.,只有session存在才能执行后续权限认证操作。 

通过以上分析,了解了rmi调用的流程。由于peach抓包获取了当前登录的管理员所有客户端报文,虽然发包重新启动了一次rmi调用,但是由于这个报文中封装了管理员有效的sessionId(因为客户端未退出),所以它能通过这个sessionId在服务端获取有效的session,从而绕过认证。这也解释了为什么只有在管理员用户在线时发包才能成功,因为虽然发包报文包含了sessionId,但是当用户不在线时,它的session已经从服务端缓存中踢除了。

5、讨论

以上,由于这种发包绕过要依赖于当前用户必须在线,那么这还算安全问题么?欢迎发表看法。

你可能感兴趣的:(工作相关,渗透测试,RMI,Spring)