文件上传漏洞

基础介绍

文件上传漏洞

顾名思义:因文件上传而导致的一个漏洞。但文件上传功能本身没有危害,当上传恶意脚本后,危害便出现了。所以文件上传漏洞的本质便是没有对上传的文件做校验。
按理说做了校验就好,但其实做了校验也分绕过和绕不过,就绕过而言又分为很多类型。

文件上传漏洞的必要条件

  • 存在上传点(起点:没有上传点,文件上传漏洞也就不存在)
  • 可以上传动态文件(把恶意脚本放入目标点)
  • 上传到的目录有执行权限,文件可执行(上传后,脚本可以运行)
  • 可以访问到上传的动态文件(可以指挥恶意脚本)

前端检测绕过

前端检测介绍

  • 开发者考虑到对上传文件做符合要求的限定,于是通过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

Nginx

CGI

空字节代码执行

其他上传绕过

双文件上传

竞争上传

posted @ 2021-08-20 22:28  ceiling~  阅读(299)  评论(0编辑  收藏  举报