1、背景
该产品基于CS架构设计,可以通过管理员账户客户端创建系统用户。首先通过wireshark抓取了登陆到创建用户的整个报文,并将报文解密,配置peach发包工具,模拟管理员登陆客户端并创建其他用户的功能。
2、现象
当管理员用户在线的时候,peach工具能够成功发包创建用户。而管理员用户不在线时,peach工具发包无法创建用户。也就是说peach工具复用了已经登陆成功的管理员用户session。
3、登陆机制
用户登陆成功后,会在服务端创建session保存用户信息,并将sessionId分别存入服务端InheritableThreadLocal和ThreadLocal两个字段,将session缓存在服务端,并将session作为返回值返回客户端,更新客户端的sessionId.
4、问题定位
客户端RMI调用的时序如图所示:
客户端通过RMI方式调用服务端接口,首先会获取客户端本地sessionId,封装到Spring ContextRemoteIncation中,服务端在执行invoke方法调用前,会将客户端发送过来的contextRemoteInvocation导入线程自身的InheritableThreadlLo