00截断上传绕过_【文件上传与解析】文件上传与解析漏洞总结v1.0
Hello,各位小伙伴晚上好~
这里是依旧勤劳写公众号的小编~
今天本公众号将推出一个新的模块,那就是漏洞知识点总结模块!!!(此处应有掌声~)
该模块的文章会总结各种类型的漏洞的基础理论知识,文章内容也会不断修改,不断完善,因此该模块文章带版本号,如v1.0。
第一期,我们就文件上传漏洞和文件解析漏洞做一次总结。
话不多说,让我们直接开始本期的内容吧~
Part.1
文件上传漏洞
文件上传漏洞
什么是文件上传漏洞呢?
大多数网站都有文件上传的接口,如果没有对上传的文件类型做严格的限制,会导致攻击者可以上传恶意文件。(例如Webshell)
利用这些恶意文件,攻击者可能获取到执行服务器端命令的能力。
漏洞分析
我们从DVWA网站的代码来理解文件上传漏洞。
网站上传界面:
(1)low 等级
前端代码:
前端通过POST方法,将文件传给php处理:
PHP通过$_FILES方法接收文件属性:
$_FILES['uploaded']['name'],获取客户端文件的原名称;
$_FILES['uploaded']['tmp_name'], 获取文件被上传后在服务端存储的临时文件名。
可以看到,这里并未对上面两个参数做任何处理,就通过move_uploaded_file()函数完成了上传,因此存在文件上传漏洞,因为我们可以在此处上传任意类型的文件。
(2)Medium级别
Medium等级通过$_FILES ['uploaded']['type']获取了文件的MIME类型,通过$_FILES['uploaded']['size']获取了文件的大小。
通过设置白名单的方式,只允许上传jpeg和png类型的文件,并且上传的文件大小需要小于100K。
这种方法也很容易绕过,我们依然可以上传一个任意后缀的文件,使用Burp进行抓包,修改“Content-Type”字段为为“image/jpeg”即可。
//将application/octet-stream修改为image/jpeg
(3)high级别
high级别新增了一段代码用于提取文件的后缀名:
$uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
首先利用strrpos() 函数查找“.”在变量$uploaded_name中出现的位置,然后将得到的数值加1,最后利用substr()函数从变量$uploaded_name的指定位置截取部分字符串。
再通过白名单的方式单独检查文件后缀名是否合规:
if (($uploaded_ext == "jpg" || $uploaded_ext == "JPG" || $uploaded_ext == "jpeg" || $uploaded_ext == "JPEG") && ($uploaded_size < 100000))
getimagesize( $uploaded_tmp )会检查文件内容是否是图片格式的。
该级别可以通过%00截断的方式绕过,或者直接上传一个图片马,尝试配合文件包含漏洞来进行绕过了,这两种方法在下面进行讲解。
从上面三个例子我们可以看出,对文件格式做严格的校验可以一定程度上防范文件上传漏洞。
常见的绕过方法
(1)修改文件后缀
如果文件类型检测是在前端代码中,如JS代码:
我们可以将我们构造的恶意脚本后缀修改为图片类型,进行上传:
然后使用burp进行抓包,将后缀名改回来即可:
(2)修改Content-Type类型
如果后端服务器只对$_FILES['uploaded']['type']进行校验的话,那么我们只需要抓包修改报文的Content-Type类型即可,因为$_FILES['uploaded']['type']读取的就是报头的Content-Type字段,修改该字段也并不会对我们上传的文件有任何影响。
(3)%00截断
有时候,我们在文件名后面加一个%00,就可以截断后面的内容,因为%00会被判断为终止符。
如果通过GET的方法传输文件,我们直接抓包添加%00即可:
如果通过POST方法进行传输,与GET方法不同,POST方法不会对%00进行解码,我们需要选中%00,通过ctrl+shift+u快捷键进行转换才行。
但是%00截断仅存在于php < 5.3.4的版本中,且需要关闭magicquotesgpc,因为该开关会对%00等进行转义。而在5.3.4及以上版本中,存在另一个函数addslashes()进行转义。
(4)伪造合法的文件头
从DVWA High级别的文件上传页面可以看出,有时候在后端严格的检测下,我们只能够上传后缀为图片格式的文件。
这种情况下,如果能找到文件包含、文件解析这样的漏洞,我们也可以先将恶意脚本的后缀改成图片格式(如.jpg)上传到服务器中去,再通过其他漏洞来执行。
但是服务器端为了规避这种情况,使用getimagesize()这类函数来检查文件内容是否是图片格式的,这样我们伪造的恶意脚本就无法上传了。
通过伪造合法的文件头可以绕过这种检测。通常检测函数根据文件的前10个字节,就可以判断出文件的类型,而图片的文件头一般都是固定的。
因此,我们可以在我们的恶意脚本前加上一段文件头即可,如GIF89a(gif文件头)。又或者使用010 editor等编辑工具打开一张图片,在图片中加上webshell脚本:
这样我们就可以成功上传图片马了,关于怎么利用文件包含漏洞执行图片马,我将在文件包含知识总结专题中进行讲解。
Part.2
文件解析漏洞
文件解析漏洞
1、什么是文件解析?
当服务器接收到一个HTTP请求的时候,web容器(如IIS、Apache)首先会根据文件的后缀名,来决定如何去处理这个请求。
当服务器获取到所请求的页面的后缀(如.php)后,接下来就会在服务器端寻找可以处理这类后缀名的应用程序,如果找不到则直接把这个文件返还给客户端。
Apache 解析漏洞
该解析漏洞属于用户配置问题,且Apache与php的结合方式需要为Module,如下:
首先要明确一点,Apache对文件的解析顺序是从右往左的,直到遇见一个Apache可以解析的文件后缀为止。
例如访问/test.php.aaa.bbb,由于Apache不认识aaa和bbb,会从右往左一直遍历到后缀.php为止。
文件 /etc/mime.types,记录了大量Apache可以解析的文件类型。
//上图php类型都被注释掉了,不可以解析。
还有另外一个文件/etc/apache2/mods-enabled /php.config
通过正则的方式记录了可以交给php解析的文件类型,上图可以解析.php文件。
提问:访问index.php.aaa是否可以顺利解析?
答案是不可以的,初始情况下Apache是不存在这个漏洞的,从右往左识别到.php后,服务器将index.php.aaa整体交给php来处理,但php并不认识.aaa,所以无法解析。
该漏洞产生的原因是,运维人员在配置服务器时,为了使服务器能够解析.php,自己添加了一个handler,到/etc/apache2/sites-enabled/目录下。
我们在该目录下添加的任意名称的配置文件都会生效,例如创建一个1.conf,内容为:
AddHandler不同于SetHandler,只要文件名中的任何位置有.php,就会被交给php_module解析,而SetHandler只会解析后缀为.php的文件。
IIS 6.0解析漏洞
(1)利用特殊符号“;”
在IIS 6.0版本中,“;”号的功能类似于%00截断,例如我们上传一个恶意脚本“webshell.asp;.jpg”,文件后缀为jpg,可以绕过服务器检测,当我们访问这个文件时,分号后面的内容会被截断,就相当于我们访问的是webshell.asp,测试如下:
(2)文件名为.asp
如果一个目录以“xxx.asp”的格式命名,该目录下的所有类型的文件都会被当作asp文件来解析执行。例如:
IIS 7.5解析漏洞
当IIS 7.5在Fast-CGI运行模式下时,如果服务器开启了“cgi.fix_pathinfo”功能,且去掉了php-cgi.exe程序的“Invoke handler only if request is mapped to”勾选。那么当访问的文件路径不存在时,会对路径进行修剪。
例如webshell.jpg是我们上传的图片马,直接访问/webshell.jpg无法被php解析。
但是利用路径修剪功能,我们可以访问 /webshell.jpg/.php,服务器发现为.php后缀,便交给php解析。php发现无法访问该路径后,便对路径进行修剪,最终解析的是webshell.jpg文件。
Nginx解析漏洞
刚安装好的Nginx是无法解析php文件的。
修改/etc/nginx/sites-available/defaule文件的部分配置如下,以套接字方式启动:
使用php5-fpm start启动web服务后,就可以解析.php文件:
(1)Nginx目录遍历漏洞
Nginx默认不开启目录遍历,需要修改前面的default配置文件:
开启目录遍历漏洞后,可以遍历目录:
(2)Nginx 文件解析漏洞
对于任意文件,访问时在后面添加/任意文件名.php ,便可交给php进行解析。
和Apache一样,Nginx也是通过 /etc/nginx/mine.types识别文件。
该漏洞同样是配置导致的,默认不存在,需要在/etc/php5/fpm/php.ini中开启cgi.fix_pathinfo功能,该功能默认开启。
还需要配置/etc/php5/fpm/pool.d/www.conf文件,修改security.limit_extensions为空,允许解析其他格式文件为PHP,原本的配置为:
//只解析php,php3,php4,php5后缀的文件
修改为空后,会把所有后缀都以php解析。
例如1.jpg是我们上传的图片马,利用该漏洞进行访问:
Nginx发现访问的文件为.php后缀,便交给php处理,php发现/1.jpg/1.php不存在,剪掉/1.php后缀,把1.jpg当成需要执行的文件来处理。
Part.3
文件上传漏洞的防护
漏洞防护
1、前端JS代码过滤
前端通过JS代码做第一次过滤,可以起到一定的防范作用。虽然可以被burp人工绕过,但仍然可以减少一些攻击行为,以及过滤掉正常用户的误上传操作,减轻后台服务器的压力。
2、后端设置黑白名单
通过设置黑名单或者白名单的方式,对上传文件的后缀做严格的检查。但黑名单可能出现遗漏的情况,也可能被大小写等方式绕过,因此白名单一般更安全。
3、限制上传文件大小
避免攻击者上传过大的恶意脚本,防止由于内存、磁盘耗尽而造成的拒绝服务攻击。
4、将文件上传的目录设置为不可执行
只要Web容器无法解析该目录下的文件,即使攻击者上传了恶意脚本文件,服务器本身也不会受到影响。当前一些网站,在文件上传之后,会将文件放到独立的存储上,做静态文件处理,一方面方便使用缓存加速,降低性能损耗,另一方面也杜绝了脚本被执行的可能性。
5、采用随机数改写文件名
只要攻击者无法获取他们上传的脚本的文件名,他们也就无法访问到上传的恶意脚本了。
Part.4
结语
这就是今天的全部内容了,小伙伴们都学会了吗?
如有问题,欢迎到我的微信公众号留言哦~
Peace!
00截断上传绕过_【文件上传与解析】文件上传与解析漏洞总结v1.0相关推荐
- 00截断上传绕过_关于上传中的00截断分析
关于上传中00截断的细节,很多朋友在渗透中都会发现一些这样的有趣现象,这个站点使用00截断上传的方法上传成功了,而换一个站点又失败了,这是什么原因呢?你看了这篇文章就会明白. 00截断原理 0x00是 ...
- 00截断上传绕过_小谈截断上传漏洞
0x00 前言 小菜今天在测试网站的时候,发现存在上传点,于是尝试各种姿势,环境为iis7.5,于是乎来一个解析漏洞,发现并不可以,最终百度乎,发现上传有很多种利用方法,所以小菜就去学习了一下截断上传 ...
- 00截断上传绕过_上传绕过总结
欢迎各位关注我的专栏,在以后的时间里,我将分享更多技术,在这里你能学到很多知识和姿势.自我介绍:高级安全研究员|擅长Python\PHP\JAVA审计;SONRT规则;etc.|陈小兵著<SQL ...
- 使用elementui实现表单上传功能_使用ElementUI中的upload组件上传Excel文件
最初使用该组件实现图片上传是没有问题的,前后端配合,最终实现想要的效果,组件使用过代码如下: 将文件拖到此处,或点击上传 现在改为使用该组件实现Excel文件上传,组件的使用几乎是不变的,代码如下: ...
- 如何在label上显示字_如何地图上标注店面_新开的店铺要怎样上地图显示_怎么将公司标记在地图...
新开的店铺商铺商家商户企业工厂怎么标注地图位置?如何地图上标注店面_怎么将店铺标记在地图_新开的店铺要怎样上地图显示?还没有办好营业执照可以做?您可能会有很多地图疑问?请直接联系腾图通地图服务公司为您 ...
- php 函数传值_传址_函数参数,php函数的传值与传址(引用)详解
在php中我们函数传值就比较简单了,但可能有些朋友地天真无邪函数传址或引用搞不明白,下面小编来给各位介绍在php中函数传值与传址(引用)介绍,希望对各位有所帮助. php中引用的用法: 1. 变量的引 ...
- php 函数传值_传址_函数参数,php函数的传值与传址(引用)详解_PHP教程
在php中我们函数传值就比较简单了,但可能有些朋友地天真无邪函数传址或引用搞不明白,下面小编来给各位介绍在php中函数传值与传址(引用)介绍,希望对各位有所帮助. php中引用的用法: 1. 变量的引 ...
- 树莓派数据上传数据库_树莓派内部数据向domoticz的上传
树莓派的数据上传->Domoticz 树莓派的温度检测到的数据可以通过API发送到domoticz 示例代码:#!/usr/bin/env python # -*- coding:utf-8 - ...
- mysql 上亿记录_一入职!就遇到上亿(MySQL)大表的优化....
XX实例(一主一从)xxx告警中每天凌晨在报SLA报警,该报警的意思是存在一定的主从延迟(若在此时发生主从切换,需要长时间才可以完成切换要追延迟来保证主从数据的一致性) XX实例的慢查询数量最多(执行 ...
最新文章
- August 14, 2009 - Choice
- nagios报警不发邮件
- python从入门到精通怎么样-Python 从入门到精通:一个月就够了
- android 中ImageView的scaletype属性
- 查找指定日期数据所在分区数据
- pure-ftpd搭建教程
- makefile中的wildcard
- SpringBoot整合MyBatis后台分页前端BootstrapTable添加删除查看编辑搜索数据(二)
- 6、ES6的let和const
- npm:no such file /usr/local/lib/node_modules/vue-cli/node_modules/get-stream
- c语言学生成绩管理系统的设计,C语言学生成绩管理系统设计
- 基于linux服务器的hashcat握手包破解
- Python软件编程等级考试三级——20220618
- Minecraft Server 搭建手账
- 【滴水逆向笔记】C语言指针
- tools:ignore=“MissingConstraints“属性
- 开发者讨厌图形界面吗_为什么这么多开发人员讨厌招聘人员
- Mac OS X 系统更新升级包下载后的存储位置
- 基于用户协同过滤算法的电影打分与推荐
- GD32F303CCT6与GD32F407VKTC spi 主从通信