文件上传漏洞总结
文件上传概念
文件上传本身为应用系统提供的用户进行附件或者头像上传的一个功能点,但是由于开发人员对上传所进行限制不严,用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力,从而导致文件上传漏洞诞生。
文件上传漏洞常见的校验方式
客户端校验
通过javascript来校验上传文件的后缀是否合法,可以采用白名单,也可以采用黑名单的方式。
判断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包。
服务器端校验
- MIME 类型检测,MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。
application/msword -> .docapplication/octet-stream -> .exeapplication/pdf -> .pdfapplication/x-javascript -> .jsapplication/x-rar -> .rarapplication/zip -> .zipimage/gif -> .gifimage/jpeg -> .jpg / .jpegimage/png -> .pngtext/plain -> .txttext/html -> .htmlvideo/mp4 -> .mp4 - 文件目录路径检测,对目录路径的检测不够严谨而导致可以用00截断进行攻击
- 文件扩展名检测:白名单与黑名单
- 文件内容检测
- 文件幻数检测(文件开头)幻数 magic number,它可以用来标记文件或者协议的格式,很多文件都有幻数标志来表明该文件的格式。
.jpg FF D8 FF E0 00 10 4A 46 49 46
.gif 47 49 46 38 39 61
.png 89 50 4E 47
- 文件加载检测
1.对渲染/加载测试的攻击方式是代码注入绕过
使用winhex在不破坏文件本身的渲染情况下找一个空白区进行填充代码,一般会是图片的注释区2.对二次渲染的攻击方式是攻击文件加载器自身
如果要对文件加载器进行攻击,常见的就是溢出攻击;上传自己的恶意文件后,服务器上的文件加载器会主动进行加载测试,加载测试时被溢出攻击执行 shellcode,比如 access/mdb 溢出
常见的文件上传漏洞
编辑器上传漏洞
FCKeditor
判断版本:
/fckeditor/editor/dialog/fck_about.html
/FCKeditor/_whatsnew.html
上传路径:
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截断,添加文件头
- FCK在上传了诸如shell.asp;.jpg的文件后,会自动将文件名改为shell_asp;.jpg。可以继续上传同名文件,文件名会变为shell.asp;(1).jpg
- 提交shell.php+空格绕过,空格只支持windows系统,linux系统是不支持的,可提交shell.php+空格来绕过文件名限制。
利用参考:https://cloud.tencent.com/developer/article/1522652
Kindeditor
kindeditor<=4.1.5文件上传漏洞,可上传html,txt等多种文件类型。
查看版本信息:http://www.xxx.org/kindeditor//kindeditor.js
根本脚本语言自定义不同的上传地址,上传之前有必要验证文件 upload_json.* 的存在
kindeditor/asp/upload_json.asp?dir=file
kindeditor/asp.net/upload_json.ashx?dir=file
kindeditor/jsp/upload_json.jsp?dir=file
kindeditor/php/upload_json.php?dir=file
利用EXP:
利用参考:https://www.cnblogs.com/someone9/p/10162720.html
ewebeditor
asp版 2.1.6 上传漏洞利用程序
需登录后台,上传一个后缀为asa的木马
EXP:
UEditor
Ueditor是百度开发的一个网站编辑器,目前已经不对其进行后续开发和更新,该漏洞只存在于该编辑器的.net版本。其他的php,jsp,asp版本不受此UEditor的漏洞的影响,.net存在任意文件上传,绕过文件格式的限制,在获取远程资源的时候并没有对远程文件的格式进行严格的过滤与判断。
漏洞利用:上传图片马到目标站点或者其他可以上传图片马的地址: http://目标站点/upload/1.gif, 远程shell地址需要指定扩展名为 http://目标站点/upload/1.gif?.aspx
利用EXP:
中间件上传漏洞
IIS6.0
在 IIS6.0 中有两个很重要的 asp 解析漏洞:假设当前有一个名为 "xxx.asp" 的目录,那么该目录下的所有文件都将被作为 asp 文件解析,假设上传一个名为 "test.asp;xxx.jpg" 时,该文件会被当做 asp 文件解析。
IIS7.5
这个其实不能算 IIS 的洞,其实是 PHP 的解析漏洞,这个漏洞利用条件是服务器在 php.ini 中将 cgi.fix_pathinfo 的值设置为1,然后当我们访问服务器上任意一个文件时(如: http://127.0.0.1.com/a.jpg),当我们在 URL 后面添加。PHP(即: http://127.0.0.1/a.jpg/.php),那么文件 a.jpg 就将被作为 PHP 文件来解析
Apache
漏洞版本包含:
apache 2.0.x <= 2.0.59
apache 2.2.x <= 2.2.17
apache 2.2.2 <= 2.2.8
Apache是从右到左开始判断解析,如果为不可识别解析,就再往左判断,比如 1,php.owf.rar ".owf"和".rar" 这两种后缀是Apache不可识别解析,Apache就会把1.php.owf.rar解析成php,如何判断是不是合法的后缀就是这个漏洞的利用关键,测试时可以尝试上传一个1.php.owf.rara.jpg.png 去测试是否是合法后缀,任意不识别的后缀,逐级向上识别。
Nginx
Nginx默认是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置_FILENAME。当访问www.xx.com/phpinfo.jpg/1.php这个URL时,$fastcgi__name会被设置为"phpinfo.jpg/1.php",然后构造成_FILENAME传递给PHP CGI,但是PHP为什么会接受这样的参数,并将phpinfo.jpg作为PHP文件解析呢?这就要说到fix_pathinfo这个选项了。 如果开启了这个选项,那么就会触发在PHP中的如下逻辑:PHP会认为_FILENAME是phpinfo.jpg,而1.php是PATH_INFO,所以就会将phpinfo.jpg作为PHP文件来解析。
漏洞包含的版本:
nginx 0.5.*
nginx 0.6.*
nginx 0.7 <= 0.7.65
nginx 0.8 <= 0.8.37
上传绕过
可解析扩展名绕过
黑名单外的可解析扩展名:
- Aspx,asp,asa,ashx,cer
- Php, php3,php4,php5
- Jsp,jspx,jspf
语言 | 可解析后缀 |
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 |
Htaccess
.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置.通过htaccess文件,可以实现:网页301重定向、自定义404页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。如果指定文件名的文件,才能被当做PHP解析,内容为
<FilesMatch "jpg">
SetHandler application/x-httpd-php
</FilesMatch>
将该目录下匹配的jpg文件解析为php执行。
配合操作系统文件命令规则
- 上传不符合windows文件命名规则的文件名,会被windows系统自动去掉不符合规则符号后面的内容。
test.asp.
test.asp(空格)
test.php:1.jpg
test.php:: $DATA
- 借助系统特性突破扩展名验证,如:test.php_(在windows下,下划线是空格,保存文件时下划线被去掉剩下test.php)
检测文件内容-文件包含绕过
- 配合文件包含漏洞(前提:校验规则只校验当文件后缀名为asp/php/jsp的文件内容是否为木马)
绕过方式:(这里拿php为例,此漏洞主要存在于PHP中)
- 先上传一个内容为木马的txt后缀文件,因为后缀名的关系没有检验内容;
- 然后再上传一个.php的文件,内容为<?php Include("上传的txt文件路径");>
#PHP
<?php Include("上传的txt文件路径");?>
#ASP
<!--#include file="上传的txt文件路径" -->
#JSP
<jsp:inclde page="上传的txt文件路径"/>
or
<%@include file="上传的txt文件路径"%>
以ueditor为例
利用NTFS ADS特性
ADS是NTFS磁盘格式的一个特性,用于NTFS交换数据流。在上传文件时,如果waf对请求正文的filename匹配不当的话可能会导致绕过。
超长文件名与垃圾字符
- 超长文件名CONTENT-LENGTH绕过
针对这种类型的验证,通过上传一些非常短的恶意代码来绕过。上传文件的大小取决于,Web服务器上的最大长度限制。我们可以使用不同大小的文件来fuzzing上传程序,从而计算出它的限制范围。
- 垃圾字符(文件内容-文件名)
文件内容:
文件名:
文件名Enter回车键
- 文件名中间回车
- 文件名后回车
多文件上传突破绕过
上传点支持多文件上传,但是却只对第一个文件做了过滤,所以上传只对第一个文件后缀名进行检测,对第二个文件不进行检测直接上传到服务器。
Content-Disposition与 Content-Type
Content-Disposition 响应头指示回复的内容该以何种形式展示,是以内联的形式(即网页或者页面的一部分),还是以附件的形式下载并保存到本地。Content-Disposition 消息头最初是在 MIME 标准中定义的,HTTP 表单及 POST 请求只用到了其所有参数的一个子集。只有 form-data 以及可选的 name 和 filename 三个参数可以应用在HTTP场景中。
Content-Type(内容类型),用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,这就是经常看到一些 PHP 网页点击的结果却是下载一个文件或一张图片的原因。
Content-Type 标头告诉客户端实际返回的内容的内容类型。语法格式:
Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something
- 修改Content-Disposition中form-data
将form-data; 修改为~form-data;替换大小写:将 form-data 修改为 f+orm-data
将 from-data 修改为 form-d+ataHTTP header 属性值绕过*进行绕过:Content-Disposition: form-data; name="file"; filename="yjh.php"
通过替换form-data 为*来绕过
Content-Disposition: *; name="file"; filename="yjh.php"空格绕过:Content-Disposition: form-data; name="file"; filename="yjh.php"
Content-Type: application/octet-stream
将Content-Disposition: form-data 冒号后面 增加或减少一个空格
将form-data; name="file"; 分号后面 增加或减少一个空格
- 修改Content-Type
boundary后面加入空格:
Content-Type: multipart/form-data; boundary=---------------------------471463142114
修改后:
Content-Type: multipart/form-data; boundary =---------------------------471463142114
条件竞争
通过BURP不断发包,导致不断写入Webshell,再写入速度频率上超过安全软件查杀频率,导致绕过。
文件上传FUZZ测试
文件上次的一个基本流程:
上传路径测试
- 上传接口的查找:
- 在js或HTML源码注释可能会能找到上传接口的踪迹,一般来说在burp的httphistory可搜索出来。
- 测试文件中可能会存在系统完整的文件上传API接口,且可未授权访问
- 开发文档,里面包含了整个系统的API;也有不少系统都是经市面上的cms二次开发而来的,只要能找到对应的开发手册,说不定就能获取到上传接口了
- 上传接口fuzz测试,首先要根据现有的文件上传接口特点和规律,测试规律字典。
fileupload_filesupload_FileUpload_Filefiletestfile_testfileTestfile_TestUploadfileUploadFileUploadFilesuploadFileuploadfileuploadfilesUploadTempUploadtempUploadtmpuploadtmpUploadTestUploadtesttestUploadtestuploadtempuploadallow_file_uploadfile_uploadupload_testupload_fileupload_tmpupload_tempupload/nameupload/filesupload/fileupload/tempupload/test/Upload/uploadImguploadImgfiledatauptestuploadFirmwarefile1file2file3file4filesuploadandroidUploadUploadPostFilepostfileuploadTestuploadtestuploadtempupupload1upload2uploadFirmwareupfileuploadimguploadimageuploadimagesfileuploadfileupload1upload_picswfuploaduploadauploadPicuploadsUploadsuploadpicuploadfaceokuploadsaveuploadSharePicupload_flashuploadphotopost_upfilepost_uploadupfilefileupfileup1fileuploadsdatacontentfile-uploadflagtextwebuploaderimgflashbackupbackupsbackup-uploadupshallupimgupimagesupimageflashUPkeyfileFiletesttmptemppcimgphoneimguploadpicturespluploadmultiuploaduploadifyfileuploadersaveUploadCertSaveUploadCertproUploadFILE_UPLOADFile_uploadfile_uploadFile_Upload
上传绕过测试
- 文件上传模糊测试
https://github.com/c0ny1/upload-fuzz-dic-builder








文件上传思路2
反弹shell脚本
上传定时任务
Serv-U上传定时任务
文件上传安全防护
1、对上传文件类型进行验证,除在前端验证外在后端依然要做验证,后端可以进行扩展名检测,重命名文件,MIME类型检测以及限制上传文件的大小等限制来防御,或是将上传的文件其他文件存储服务器中。
2、严格限制和校验上传的文件,禁止上传恶意代码的文件。同时限制相关上传文件目录的执行权限。
3、对上传文件格式进行严格校验,文件扩展名服务端白名单双重校验;
4、严格限制上传的文件路径,隐藏上传文件路径。
5、对上传文件进行重命名处理。
文章参考:
https://joychou.org/web/bypass-waf-of-file-upload.html
https://www.sec-in.com/article/218
浙公网安备 33010602011771号