文件上传漏洞
基础介绍
文件上传漏洞
顾名思义:因文件上传而导致的一个漏洞。但文件上传功能本身没有危害,当上传恶意脚本后,危害便出现了。所以文件上传漏洞的本质便是没有对上传的文件做校验。
按理说做了校验就好,但其实做了校验也分绕过和绕不过,就绕过而言又分为很多类型。
文件上传漏洞的必要条件
- 存在上传点(起点:没有上传点,文件上传漏洞也就不存在)
- 可以上传动态文件(把恶意脚本放入目标点)
- 上传到的目录有执行权限,文件可执行(上传后,脚本可以运行)
- 可以访问到上传的动态文件(可以指挥恶意脚本)
前端检测绕过
前端检测介绍
- 开发者考虑到对上传文件做符合要求的限定,于是通过JavaScript在前端对上传文件的后缀名,做了验证
- 但是,在前端做的任何检测机制都是纸老虎,做了和没做一个样
如何判断是前端检测
- 看源代码
- 直接上传不合规文件,页面弹出提示框,但浏览器没有收到服务器的响应
如上图所示,浏览器没有收到从服务器来的关于提示信息的响应报文
如何绕过
使用抓包工具抓包后修改文件后缀名
修改后,发送数据包
上传成功
看源代码
删除页面前端验证的代码
不知道为什么,在chrome里不可以,我没删干净吗?
关闭浏览器的JavaScript
上传成功.
服务器端检测绕过
MIME类型检测
什么是MIME类型
描述消息内容类型的因特网标准,浏览器会根据上传文件的扩展名,对应到相应的MIME类型上
常用的MIME类型
- gif image/gif
- jpg image/jpeg
- png image/png
- bmp image/bmp
- psd application/octet-stream
- ico image/x-icon
- rar application/octet-stream
- zip application/zip
- 7z application/octet-stream
- exe application/octet-stream
- avi video/avi
- rmvb application/vnd.rn-realmedia-vbr
- 3gp application/octet-stream
- 3gp application/octet-stream
- mp3 audio/mpeg
- wav audio/wav
- krc application/octet-stream
- lrc application/octet-stream
- txt text/plain
- doc application/msword
- xls application/vnd.ms-excel
- ppt application/vnd.ms-powerpoint
- pdf application/pdf
- chm application/octet-stream
- mdb application/msaccess
- sql application/octet-stream
- con application/octet-stream
- log text/plain
- dat application/octet-stream
- ini application/octet-stream
- php application/octet-stream
- html text/html
- ttf application/octet-stream
- fon application/octet-stream
- js application/x-javascript
- xml text/xml
- dll application/octet-stream
绕过方法
上传成功
文件内容检测
简单文件头检测
在恶意脚本内容前 添加 允许通过的文件类型的文件头
常用的文件头
- JPEG (jpg),文件头:FFD8FF
- PNG (png),文件头:89504E47
- GIF (gif),文件头:47494638
- TIFF (tif),文件头:49492A00
- Windows Bitmap (bmp),文件头:424D
- CAD (dwg),文件头:41433130
- Adobe Photoshop (psd),文件头:38425053
- Rich Text Format (rtf),文件头:7B5C727466
- XML (xml),文件头:3C3F786D6C
- HTML (html),文件头:68746D6C3E
- Email [thorough only] (eml),文件头:44656C69766572792D646174653A
- Outlook Express (dbx),文件头:CFAD12FEC5FD746F
- Outlook (pst),文件头:2142444E
- MS Word/Excel (xls.or.doc),文件头:D0CF11E0
- MS Access (mdb),文件头:5374616E64617264204A
- WordPerfect (wpd),文件头:FF575043
- Postscript (eps.or.ps),文件头:252150532D41646F6265
- Adobe Acrobat (pdf),文件头:255044462D312E
- Quicken (qdf),文件头:AC9EBD8F
- Windows Password (pwl),文件头:E3828596
- ZIP Archive (zip),文件头:504B0304
- RAR Archive (rar),文件头:52617221
- Wave (wav),文件头:57415645
- AVI (avi),文件头:41564920
- Real Audio (ram),文件头:2E7261FD
- Real Media (rm),文件头:2E524D46
- MPEG (mpg),文件头:000001BA
- MPEG (mpg),文件头:000001B3
- Quicktime (mov),文件头:6D6F6F76
- Windows Media (asf),文件头:3026B2758E66CF11
- MIDI (mid),文件头:4D546864
举个例子
完整文件结构检测
利用copy命令将图片和木马合成为一张图片
举个例子
白名单检测
0x00截断绕过
条件
- php版本小于 5.3.4
- magic_quotes_gpc为OFF状态
截断点
- 所有路径和上传的地方
补充
get和post有区别
解析漏洞
IIS解析漏洞
IIS6.0
- xx.php;1.jpg
IIS7.0/7.5/Nginx<8.03
- 在上传文件路径后添加/.php
- 会被当做PHP脚本文件来解析
黑名单检测
操作系统特性
- windows对大小写不敏感
- windows系统下xxx.php::$DATA会在服务器上生成一个xxx.php的文件
- windows系统下加入某些字符,会被自动去除
.
空格
<
·>
>>>
081-0xff
等等
语言特性
php可解析的后缀
- php
- php5
- php4
- php3
- php2
- pHp
- pHp5
- pHp4
- pHp3
- pHp2
- html
- htm
- phtml
- pht
- Html
- Html
- Htm
- pHtml
jsa可解析的后缀
- jsp
- jspa
- jspx
- jsw
- jsv
- jspf
- jtml
- jSp
- jSpx
- jSpa
- jSw
- jSv
- jSpf
- jHtml
asp/aspx可解析的后缀
- asp
- aspx
- asa
- asax
- ascx
- ashx
- asmx
- cer
- aSp
- aSpx
- aSa
- aSax
- aScx
- aShx
- aSmx
- cEr
中间件特性
解析漏洞
.htaccess
代码不严谨
- 双写绕过
- 对于空格,只做了单次测试
解析漏洞
IIS
IIS5.X-6.0
目录解析漏洞
描述:在asp、asa目录下的文件解析成asp文件(能做到这一步的前提:可以控制文件上传的路径或者文件名)
asp/xxx.jpg
文件名解析漏洞
描述:服务器默认不会读取;(分号)后的内容
xx.asp;.jpg
畸形文件名解析漏洞
描述:IIS6.0以下可执行文件还有 asa cer cdx,
- aspx不一定能解析,因为aspx是.net环境
IIS7.0/7.5
利用解析图片中的代码上传webshell
- 前提:开启Fast-CGI模式,上传下面所示代码的1.jpg文件
<?php fputs(fopen('mm.php','w'),'<?php eval($_POST[cmd])?>');?>
- 访问1.jpg/.php,则1.jpg会被解析执行
fck+IIS7.5
a.aspx.a.aspx.jpg..jpg
Apache
不可识别解析后缀名
描述:Apache在文件解析的过程,从左到右开始判断解析,如果为不可识别的后缀解析,就再往左判断
.htaccess
描述:当.htaccess文件内容为:SetHandler application/x-httpd-php时,则当前目录所有文件都是用PHP解析,因此当上传内容为PHP代码,格式为jpg的文件时,会被当做PHP文件执行
前提条件:在htpd.conf中将AllowOverride 设置为All