Tomcat中一种半通用回显方法( 二 )

原本Contorller代码的逻辑是输出input部分的内容,我们所做的就是在原本的输出内容前面,添加cmd参数执行之后的结果 。

Tomcat中一种半通用回显方法

文章插图
 
需要刷新两次的原因是因为第一次只是通过反射去修改值,这样在之后的运行中就会cache我们的请求,从而也就能获取到response 。
加入ysoserial这样,这样只要稍加改造一下,擦去泛型的部分,用完整的类名代替原本的类名,就可以放入到ysoserial中 。
中间莫名又踩了一些坑,嫌麻烦的师傅可以直接用已经改好的版本 。
https://github.com/kingkaki/ysoserial
ysoserial的第二个参数是要执行的命令,由于这里可以直接从request获取,自由度更大,所以我将第二个参数改成了要执行的命令的param 。
以 CommonsCollections2 为例,如下的方式就相当于创建了一个从cmd参数获取要执行的命令的payload 。
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsCollections2TomcatEcho cmd测试一下别的tomcat环境,以jsp为例,确保有 commons-collections4 的依赖
然后自己构造一个反序列化的环境
<%try { String input = request.getParameter("input"); byte[] b = new sun.misc.BASE64Decoder().decodeBuffer(input);java.io.ObjectInputStream ois = new java.io.ObjectInputStream(new java.io.ByteArrayInputStream(b));ois.readObject();} catch (Exception e) {e.printStackTrace();}%>可以看到内容成功的追加到了输出的body中 。
Tomcat中一种半通用回显方法

文章插图
 
一些局限性回到标题,为什么是一个半通用的方法呢?
当时构造好了之后兴匆匆的跑了一波shiro的反序列化,死活不成功,debug了很久之后发现了一个问题 。
shiro的rememberMe功能,其实是shiro自己实现的一个filter
在 org.apache.catalina.core.ApplicationFilterChain 的 internalDoFilter 中(省略一些无用的代码)
if (pos < n) {ApplicationFilterConfig filterConfig = filters[pos++];try {Filter filter = filterConfig.getFilter();...filter.doFilter(request, response, this);} catch (...)...}return;}// We fell off the end of the chain -- call the servlet instancetry {if (ApplicationDispatcher.WRAP_SAME_OBJECT) {lastServicedRequest.set(request);lastServicedResponse.set(response);}if (request.isAsyncSupported() && !servletSupportsAsync) {request.setAttribute(Globals.ASYNC_SUPPORTED_ATTR,Boolean.FALSE);}// Use potentially wrapped request from this pointif (...){...} else {servlet.service(request, response);}} catch (...) {...} finally {...}可以看到是先取出所有的的filter对当前请求进行拦截,通过之后,再进行cache request,再从 servlet.service(request, response) 进入jsp的逻辑代码 。
Tomcat中一种半通用回显方法

文章插图
 
rememberMe功能就是ShiroFilter的一个模块,这样的话在这部分逻辑中执行的代码,还没进入到cache request的操作中,此时的cache内容就是空,从而也就获取不到我们想要的response 。
最后ysoserial中所有用 createTemplatesImpl 生成payload的链都已加入了Tomcat回显的模式 。
https://github.com/kingkaki/ysoserial
  • CommonsCollections2TomcatEcho
  • CommonsCollections3TomcatEcho
  • CommonsCollections4TomcatEcho
感觉也不仅限于反序列化吧,一些拥有java代码执行的场景都通过这种方式,实现Tomcat的回显 。
比较蛋疼的一点就是一些filter中执行的代码不适用,就很可能不适用于很多框架型的漏洞,但是对于开发任人员写的Controller中的场景应该都是可以的 。
【Tomcat中一种半通用回显方法】技术比较菜,如果有师傅发现了更好的利用方式,或者一些文章中的疏漏,都可以一起探讨 。
来源:https://www.tuicool.com/articles/ymAnErB




推荐阅读