文件上传漏洞
1.文件上传漏洞定义
文件上传漏洞是web系统中常见的一种功能,通过文件上传能实现上传图片、视频,以及其他类型的文件,但是随着web中包含的功能越来越多,潜在的网络安全风险也就越大。
如果恶意用户上传了可执行的文件或者脚本,就会导致网站被其控制甚至会使其服务器沦陷,以至于引发恶意的网络安全事件。
2.文件上传漏洞原理
文件上传漏洞是指用户通过界面上的上传功能上传了一个可执行的脚本文件,而WEB端的系统并未对其进行检测或者检测的逻辑做的不够好。
通过来说文件上传功能是没有问题的,主要是服务器如何对上传的文件如何进行处理。
若WEB未对用户上传的文件进行有效的审查,若存在恶意用户对其上传一句话木马,从而实现控制WEB网站的目的。
3.文件上传思路
常规类
扫描获取上传,会员中心头像上传,台系统上传,其他途径上传。
cms类后
已知道的cms源码。
编辑类
ckeditor,fckeditor,kindeditor,xxxxeditor。
其他类/CVE
代码审计,平台或第三方应用。
web界面存在的风险点
上传头像、上传身份认证、上传文件以及有存在文件上传的地方就可能存在相关的漏洞,但不是有文件上传就一定有漏洞,但有文件上传就能进行测试。
4.文件上传实战思路
上传文件和文件执行是两个东西
漏洞分类:解析漏洞、cms漏洞、其他漏洞(编辑器漏洞、cve漏洞、安全修复)
思路:
如果有一个网站,要从文件上传的方向开始
第一步:先看中间件,看是否存在解析漏洞/CMS/编辑器漏洞/CVE/
如果有,如何找:
字典扫描:扫描会员中心,文件上传的位置
找到后,如何利用:
验证/绕过
漏洞成因
站点开放了文件上传功能,但却对上传的文件没有进行足够的限制
程序开发部署时,没有考虑到系统特性、过滤不严格
站点服务器存在解析漏洞,被黑客利用后导致可以上传任意文件
漏洞危害
文件上传漏洞最直接的威胁就是上传任意文件,包括恶意脚本、可执行程序等
如果站点服务器用于保存上传文件的目录具有执行权限,恶意文件被执行后黑客可获取服务器命令执行能力,导致站点沦陷
如果攻击者通过其他漏洞进行提权操作,拿到系统管理员权限,那么直接导致服务器沦陷
同服务器下的其他网站无一幸免,均会被攻击者控制(旁站攻击)
了解了这些 我们再来看一看webshell
WebShell , 简称网页后门。简单来说它是运行在Web应用之上的远程控制程序。
webShell其实就是一张网页,由PHP、JSP、ASP、ASP.NET等这类web应用程序语言开发,但webShell并不具备常见网页的功能,例如登录、注册、信息展示等功能,一般会具备文件管理、端口扫描、提权、获取系统信息等功能。
常见的WebShell有哪些?
大马、小马、各种马…等
拥有较完整功能的webshell,我们一般称为大马。
功能简易的webshell称为小马。
除此之外还存在一句话木马、菜刀马、脱库马等等的名词,是对于webShell功能或者特性的简称
一.无验证
按照题目的要求上传一个php文件
查看一下是否真的上传成功了,发现成功了
用蚁剑进行连接
连接成功后点击“添加”,然后打开查找flag文件
打开以后发现了flag
二.前端验证
前端验证主要是用JavaScript函数 先来了解一下这个函数
含义:JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式(如函数式编程)风格。
作用:JavaScript的作用更多的时候是实现网页的交互功能,刚刚开始学前端的小伙伴都知道网页主要由HTML+CSS实现,但只能实现一个静态的内容效果,想要实现交互和更炫酷的效果那么就需要使用JS的帮助了,所以HTML+CSS+JS被称为前端三剑客在文件上传漏洞中 js函数的主要作用就是验证你上传的文件类型是不是它允许的文件类型
解决的方法就是禁用js函数 然后上传一句话木马
进入题目,想要上传一句话木马,但是回显不允许上传
尝试了抓包,但是发现根本就抓不到包,代理和bp都没有问题
那么很有可能就是js前端验证
按f12 在调试器中把js函数禁用
禁用js函数之后 正常上传一句话木马就可以了
检查一下,发现木马上传成功了
用蚁剑测试连接,连接成功后添加数据
找到flag文件
得到flag
三.MIME绕过
通用结构
type/subtype
MIME的组成结构非常简单;由类型与子类型两个字符串中间用'/'
分隔而组成。不允许空格存在。*type *表示可以被分多个子类的独立类别。subtype 表示细分后的每个类型。
MIME类型对大小写不敏感,但是传统写法都是小写。
首先,我们要了解浏览器是如何处理内容的。在浏览器中显示的内容有 HTML、有 XML、有 GIF、还有 Flash ……那么,浏览器是如何区分它们,决定什么内容用什么形式来显示呢?答案是 MIME Type,也就是该资源的媒体类型。
媒体类型通常是通过 HTTP 协议,由 Web 服务器告知浏览器的,更准确地说,是通过 Content-Type 来表示的,例如:
Content-Type: text/HTML
1.mime的类型
text/plain (纯文本)
text/html (HTML文档)
text/javascript (js代码)
application/xhtml+xml (XHTML文档)
image/gif (GIF图像)
image/jpeg (JPEG图像)
image/png (PNG图像)
video/mpeg (MPEG动画)
application/octet-stream (二进制数据)
application/pdf (PDF文档)
2.mime绕过原理
部分Web应用系统判定文件类型是通过content-type字段,黑客可以通过抓包,将content-type字段改为常见的图片类型,如image/gif,从而绕过校验
mime绕过是后端绕过的一种
3.mime的检测方式
在文件上传过程中,服务端会针对我们的上传的文件生成一个数组,这个数组其中有一项就是这个文件的类型file_type;服务端对文件进行检测时,就是通过检测脚本中的黑白名单和这个数组中的file_type进行对比,如果符合要求就允许上传这个文件。
打开题目想要上传文件,发现上传不成功
上传一张图片试一试,发现上传成功
但是访问这个木马的url又发现并没有成功
因为已经知道了是MIME绕过,那就用bp抓包试一试
抓到包之后,更改文件类型 application/octet-stream改为image/jpeg
更改之后放包,发现上传成功
访问url发现也成功了,接下来用蚁剑连接和前面的题目一样的做法
得到flag
补充:
当浏览器在请求资源时,会通过http返回头中的
content-type:指示响应内容的格式,如果这个类型浏览器能够支持阅览&&没有设置content-disposition情况浏览器就会直接展示该资源,比如png、jpeg、video等格式,如果浏览器不支持就会,默认触发下载
content-disposition:包含响应数据的描述信息,以及下载或者在线查看的处理方式
常见的content-type可能是如下之一:
类型 描述 典型示例
text 表明文件是普通文本,理论上是人类可读 text/plain, text/html, text/css, text/javascript
image 表明是某种图像。不包括视频,但是动态图(比如动态 gif)也使用 image 类型 image/gif, image/png, image/jpeg, image/bmp, image/webp, image/x-icon, image/vnd.microsoft.icon
audio 表明是某种音频文件 audio/midi, audio/mpeg, audio/webm, audio/ogg, audio/wav
video 表明是某种视频文件 video/webm, video/ogg
application 表明是某种二进制数据 application/octet-stream, application/pkcs12, application/vnd.mspowerpoint, application/xhtml+xml, application/xml, application/pdf
nodejs返回图片示例:
fs.readFile(pathname.substring(1),function(err,data){
res.writeHead(200,{'Content-Type':'image/jpeg'});
res.setHeader('Content-Disposition', `attachment; filename="图片.jpeg"`);
res.end(data);
})
Application/octet-stream,http服务器设置响应头让浏览器下载内容-优快云博客
四. .htaccess
先来看看.htaccess是什么 .htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能
利用它文件上传的原理:上传覆盖.htaccess文件,重写解析规则,将上传的图片马以脚本方式解析
简单来说.htaccess文件就是一个服务器用来解析的配置文件,.htaccess文件上传漏洞的利用代码如下
<FilesMatch "jpg">
SetHandler application/x-httpd-php
</FilesMatch>
注:这里的意思就是用.htaccess文件调用php解析器 将各种形式文件解析成php文件进行识别。
上传php文件不成功
查看网页的源代码,发现了一个黑名单(里面的文件类型均不可以上传)
上传一个jpg文件试一试,发现上传成功
但是访问这个jpg的url发现并没有成功,所以这种情况下蚁剑也不会连接成功
因为本题目的标题就是.htaccess,所以就用.htaccess的方法试一试
我们先上传.htaccess文件
上传成功
接着再上传jpg文件
可以发现这次上传成功了,然后直接用蚁剑连接查找flag就可以了
得到flag
五.文件头检查
想要上传php文件,但是发现有白名单的限制
文件头就是为了描述一个文件的一些重要属性,比如文件的尺寸,像素,长度,宽度
因此只需要在文件里加上jpg/png/gif图片的文件头就可以了 在bp里抓包在更改文件类型就显示成功
- 文件头:原理:文件头通常是指文件的开始部分,包含有关文件本身的信息,如文 件的类型,大小,创建日期,修改日期,访问权限等。文件头可以包含一些特殊的标记或标识符,用于标识文件的格式或版本。如在图像文件中,文件头还可能包含有关图片尺寸,颜色深度,压缩算法等信息。在音频或视频文件中,文件头可能包含有关媒体格式,编码方式,帧率,比特率等的信息。文件头一般用WinHex或101 Editor查看(二进制文件)。与文件扩展名对应。
- 常见文件扩展名及其文件头:
MIDI (mid),文件头:4D546864
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
使用winhex查看文件头
查看了shell.php ,shell.jpg, shell.png文件后发现三个文件显示一样
通过剪贴板数据粘贴格式为ASCLL Hex的png文件头89504E47,保存,将shell.php改为shell.png
重复前端验证一题的操作,上传shell.php文件,用bp抓包,修改文件类型 application/octet-stream改为image/jpeg ,然后放包
上传成功
用蚁剑连接,然后找到flag
六.00截断
(1)原理:在文件后缀名中插入一个空字符%00或0x00(%00解码成16进制,0x为16进制标志)或/00,这个空字符会被解释为chr(0)(chr()是一个函数,这个函数是用来返回参数所对应的字符的,也就是说,参数是一个ASCII码,返回的值是一个字符,类型为string),对照ASCII码表可以知道,ASCII码为0-127的数字,每个数字对应一个字符,而0对应的就是NUT字符(NULL),也就是空字符。截断的关键就是这个空字符,当一个字符串中存在空字符的时候,在被解析的时候会导致空字符后面的字符被丢弃(在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束),导致绕过的发生。(ps:在文件名中插入空字符进行00截断只能用于前端绕过,后端绕过无效)
(2)格式:例如要上传shell.php文件,使用shell.php.jpg上传bp抓包,修改为shell.php%00.jpg,这样就把jpg截掉,文件绕过前端限制成功上传。
(3)使用条件:php版本<5.3.4,phpstudy中magic_quotes_gpc=off
1.漏洞简介.
PHP的00截断是5.2.x版本的一个漏洞,当用户输入的url参数包含%00经过浏览器自动转码后截断后面字符。
2.漏洞代码示例.
<?php
include "1.txt\000.jpg";
?>
测试文件1.txt如下:
<?php
echo 'fireXXX';
?>
php5.2.x版本解析1.php时,会将1.txt\000.jpg解释为1.txt
3.原理
00截断是操作系统层的漏洞,由于操作系统是C语言或汇编语言编写的,这两种语言在定义字符串时,都是以\0(即0x00)作为字符串的结尾。操作系统在识别字符串时,当读取到\0字符时,就认为读取到了一个字符串的结束符号。因此,我们可以通过修改数据包,插入\0字符的方式,达到字符串截断的目的。00截断通常用来绕过web软waf的白名单限制。
进入题目,上传一句话木马,然后抓包
抓到包后修改数据
filename要改成下面这种形式 因为jpg文件可以上传成功的
filename改成“shell.php%00.jpg”
然后把文件类型改成image/jpeg形式
放包后发现上传成功
但是发现页面中并没有显示出上传的路径
在url网址栏中删掉标蓝的部分,然后再在upload/后面加上我们上传的一句话木马shell.php
之后就用蚁剑进行连接,查询flag
七.双写绕过
(1)原理:服务器对黑名单中的内容进行处理,如黑名单中有"php"字样,上传文件名为"php" 上传后文件变成"",但仅处理一次,如正常上传一个 .php 文件后缀的因为在白名单中出现会被网页清空后缀名。这时我们可以写两个后缀名 .pcerhp 网页会检测到 cer 后缀并清空,然而清空之后 .php 并不会消失,因为网页代码并没有对这个条件做判断,只清空了 cer ,那么 .php 后缀名被保留在网页中变达到了双写后缀绕过的目的。
简单来说:双写后缀服务端对黑名单中的内容进行处理,且仅处理一次,所以可以通过双写后缀绕过.如,黑名单中有"php"字样,上传文件名为"1.php" 上传后文件变成"1."因此我们可以用pphphp当作后缀,服务端就会把这个后缀变成php 就可以上传成功
(2)使用条件:phpstudy中AllowOverride = All,mod_rewrite模块开启
(3)格式: 直接双写同一个后缀名,如php写为pphphp
双写不同的两个后缀名,且写在中间的后缀名必须是黑名单中存在或白名单中不存在的,如php,asp,要使php绕过过滤,应写为pasphp
进入题目,直接上传php文件,然后抓包
修改filename后的文件名后缀为pphphp,然后放包
显示上传成功,然后用蚁剑进行连接
最终得到flag