P20.文件上传之基础及过滤方式
前言
在现在越来越安全的体系下,SQL Injection 这类漏洞已经很难在安全性很高地站点出现,比如一些不错的.NET 或 JAVA 的框架基本上都是参数化传递用户输入,直接封死注入攻击。 而在非 php的web安全中最有威力的攻击主要有两种,第一种是SQL Injection,第二种便是上传绕过漏洞。(php 的还有远程文件包含或代码注入漏洞)。一般只要能注册普通用户,时常都能找到上传头像或附件之类的地方,这些地方就是好的突 破点,只要有办法绕过上传验证,并找到一句话木马的 web 路径基本上就能搞下这个站点。
20.1 什么是文件上传漏洞?
指程序对文件的上传未作全面的限制,导致用户可以上传一些超越用户权限的一些文件,可以是木马,shell脚本,病毒等。
20.2文件上传的原理
网站Web应用都有一些文件上传功能,比如文档、图片、头像、视频上传,当上传功能的实现代码没有严格校验上传文件的后缀和文件类型,此时攻击者就可以上传一个webshell到一个Web可访问的目录上,并将恶意文件传递给如PHP解释器去执行,之后就可以在服务器上执行恶意代码,进行数据库执行、服务器文件管理,服务器命令执行等恶意操作。还有一部分是攻击者通过Web服务器的解析漏洞来突破Web应用程序的防护
20.3 文件上传漏洞有哪些危害?
文件可以自定义,可以成为webshell,通过文件上传来上传网站后门,直接获取网站权限,属于高危漏洞。上传漏洞与SQL注入或 XSS相比 , 其风险更大 。可以获取数据库信息,可以对服务器提权,获取内网权限
20.4文件上传漏洞如何查找及判断?
-
黑盒查找 文件后台 进入网站后台不一定获得网站权限,可以从后台获取网站权限 会员中心 通过图片上传 文件扫描 使用工具扫描出后台路径 -
白盒查找 通过代码分析到上传漏洞 查找文件上传功能。
20.5 文件上传漏洞有哪些需要注意的地方?
对文件上传类型进行区分,是属于编辑器文件上传,还是属于第三方应用,还是会员中心。要确保文件上传是什么类型,就用什么类型方法对它进行后期的测试。
常规类:扫描获取上传,会员中心上传,后台系统上传,各种途径上传 CMS类:已知CMS源码,搜索已知cms漏洞 编辑器类:ckeditor,fckeditor,kindeditor,xxxeditor,也是搜索相关编辑器漏洞 配合解析漏洞下的文件类型后门:可以通过解析漏洞,上传包含后门代码的图片
20.6 文件上传在实际应用中的方式
方法一
先直接传一个PHP,实战先传马。
实战先传一个正常的图片,看看有无返回存储地址。
如果能直接上传并解析,已离成功不远。
方法二
先传一个shell,然后进行修改。
connect-Type:image/jpeg,看看是否可以进行绕过,如果不行,在上传内容添加GIF89a
当然上传了还得看是否能够被解析为php,所有的上传都要考虑是否能够被解析。
方法三
- 上传一个abc.abcd,目的只是为了查看是否为白名单还是黑名单绕过。
黑名单限制一般为此文件类型不允许上传,考虑双写,大小写,空格,php2,php3,php4,php5,pht
phtml,等方式
.htaccess文件能够设置服务器的解析文件的格式,匹配到dudu就已php的格式来解析,继而上传马
- 如果说.htaccess不能上传,接下来上传一个.user.ini,继而上传一个马
方法四
如果白名单限制上传
- 考虑00截断上传
- 文件包含漏洞+图片马
- 文件包含漏洞+二次渲染+图片马
方法五
上传的东西是否被服务器很快的删除或者移除,或者说上传成功,但是无法访问,就得考虑条件竞争。
以上均不行,考虑逻辑层面的思路。
20.7 演示案例
- 常规文件上传地址的获取说明:上传的文件要执行的话,要按照对应代码执行。
- 不同格式下的文件类型后门测试
- 配合解析漏洞下的文件类型后门测试本地文件:上传+解析漏洞=高危漏洞。
- 上传漏洞靶场环境搭建
- 测试某CMS及CVE编号文件上传漏洞测试:这种第三方插件的漏洞测试和常规漏洞测试是不一样的。
20.文件上传之基础及过滤方式
涉及资源
文件上传靶场:https://github.com/c0ny1/upload-labs/releases
P21.文件上传之后端黑白名单绕过
文件上传常见验证
后缀名(直接),类型(间接),文件头等
-
后缀名: 黑名单,白名单 黑名单: 明确不允许上传的格式后缀 asp php jsp aspx cgi war 等 如果php phtml…没有定义到后名单里,可以用这格式绕过限制,依旧可以达到效果 白名单: 明确可以上传的格式后缀 jpg png zip rar gif 等 要白名单验证要更安全 -
文件类型:MIME 信息 MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式
Content-Type称之为MIME信息
使用正常照片上传,抓包
上传0.jsp文件,抓包
伪造正常上传的content-type
https://blog.csdn.net/qq_42777804/article/details/98876646
案例演示
upload-labs 关卡分析
%00截断:可以把这个放在文件名内,绕过检测。get:会自动解码 post:不会自动解码,所以想以post提交数据%00需要把它进行url编码变成%25%30%30
过滤规则
<?php
include '../config.php';
include '../common.php';
include '../head.php';
include '../menu.php';
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array('.asp','.aspx','.php','.jsp');
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext);
$file_ext = str_ireplace('::$DATA', '', $file_ext);
$file_ext = trim($file_ext);
if(!in_array($file_ext, $deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
if (move_uploaded_file($temp_file,$img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
?>
靶场
uploadlabs
https://mmbiz.qpic.cn/mmbiz_png/cbYIBjX6JJicy3sln0zHKTBrAacxk8bMhW085lpNbdibcMOEBpLZ6DTU1S5bsBNlia0PBBMpwz2p3QQp4xkylRPSw/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1
P22.文件上传之内容逻辑数组绕过
图片一句话制作方法:
copy 1.png /b + shell.php /a webshell.jpg
文件头检测
文件头检查是指当浏览器上传到服务器的时候,白名单进行的文件头检测,符合,则允许上传,否则不允许上传。
图像文件信息判断
PHP函数
逻辑安全=二次渲染
二次渲染:分两步,先把文件上传服务器,服务器将这个文件进行保存或删除(上传的时候下面有保存和上传的按钮)
phpcms中常有
二次渲染的绕过用gif文件比较好绕,因为格式要求不是很严格
png和jpg文件要求格式很严格
PNG定义了两种类型的数据块,一种是称为关键数据块(critical chunk),这是标准的数据块,另一种叫做辅助数据块(ancillary chunks),这是可选的数据块。关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们,PNG读写软件也都必须要支持这些数据块
逻辑安全-条件竞争
条件竞争:在资源在被占用时候,无法删除进行其他操作,
在读取时,无法进行命名操作,无法rename等后续操作,所以PHP文件就上传成功了
目录命名-x.php/.
以文件夹名的突破方式绕过后缀的限制同时在最终代码执行结果会保存为php文件
数组接受+目录命名
数组
脚本函数漏洞-CVE-2015-2348
通常情况下,PHP的开发者会对文件用户上传的文件的类型、文件大小、文件名后缀等进行严格的检查来限制恶意的PHP脚本文件的上传漏洞的产生,但是攻击者有时候可以结合语言的特性以及多种绕过方法来实现文件的上传漏洞。
该CVE漏洞的产生就是由于PHP的move_uploaded_file()函数存在逻辑缺陷所致,这个函数一般在文件上传时被调用
这次的漏洞就出现在参数$destination,这个参数的是将用户上传的文件移动到最终的目的地址。如果$destionation变量是从用户$_GET或者$_POST中获取的并且我们可控,那么我们就可以利用空字符\00来截断后面的拓展名,从而造成任意文件上传。
案例演示
Uploadlabs-pass13-20 关卡测试
资源:
中间件解析漏洞: https://www.cnblogs.com/1996-11-01-614lb/p/14237744.html web中间件常见漏洞总结 📎web中间件常见漏洞总结.pdf
P23.文件上传之解析漏洞编辑器安全
前言
先判断中间件,是否有解析漏洞,字典扫描拿到上传点,或者会员中心,有可能存在文件上传的地方,而后测试绕过/验证,根据实际情况判断是白名单、黑名单还是内容其他的绕过,绕过/验证和中间件的解析漏洞也不行的话就看看CMS是否存在漏洞,然后看看编辑器漏洞有无以及其他漏洞如CVE漏洞。
1. 各个平台解析漏洞讲解
📎web中间件常见漏洞总结.pdf
2. IIS,Apache,Nginx
主流web服务器:Apache、IIS、Nginx
Apache
Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩展,将Perl/Python等解释器编译到服务器中。Apache源于NCSAhttpd服务器,经过多次修改,成为世界上最流行的Web服务器软件之一。
IIS
IIS(Internet Information Services) 是一个支持HTTP和FTP发布服务的Web服务器。它是由微软开发的web服务器,需要收费,主要用来跑asp.net asp php,只能在windows下运行
Nginx
Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今,凭借开源的力量,已经接近成熟与完善。
Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模块扩展。
目前apache和nginx好像还没有看到像IIS一样的可视化配置。在windows和linux上,apache和nginx 都是以编辑配置文件的形式来配置。
3. 各个 WEB 编辑器安全讲解
网站后台里面有操作添加文字等类似功能的时候,有些网站会套用第三方的编辑器去对文章、图片、音频等进行相关处理。如果一个网站里面有编辑器的话,那么这个编辑器是什么类型,有没有漏洞,也会成为我们利用的条件
一些网站也可通过扫描获得编辑器信息,在其它地方不能突破时可以利用编辑器的漏洞进行getsell,可以在网上搜索相关编辑器漏洞利用即可。
大部分的编辑器漏洞都是文件上传漏洞
有的网站中可能嵌入第三方web编辑软件比如:fckeditor、ewebeditor、ckeditor、kineditor等。
一些网站也可通过扫描获得编辑器信息,在其它地方不能突破时可以利用编辑器的漏洞进行getsell,可以在网上搜索相关编辑器漏洞利用即可
5. 各个 CMS 文件上传简要讲解
6. wordpress,phpcms
WordPress:[https://baike.baidu.com/item/WordPress/450615?fr=aladdin](https://baike.baidu.com/item/WordPress/450615?fr=aladdin)
phpcms:[https://baike.baidu.com/item/phpcms/1997053?fr=aladdin](https://baike.baidu.com/item/phpcms/1997053?fr=aladdin)
演示案例
演示案例
23.1 中间件解析漏洞
参考共享的中间件漏洞PDF
IIS6/ 7简要说明-本地搭建
Apache配置安全--vuthab
Apache换行解析-vulhub
Nginx解析漏洞-vulhub
Nginx文件名逻辑-vulhub
Apache 低版本解析漏洞
利用场景:
我们可以利用文件上传,上传一个不识别的文件后缀(x.php. xxx.yyy),apache 识别不了最后的yyy,向前解析直到识别,利用解析漏洞规则成功解析文件,随后后门代码被触发。
23.2 编辑器漏洞
编辑器手册
- 常见的编辑器 Fckeditor exp利用 Ueditor 漏洞利用
扩展
1.POC(Proof ofConcept),中文意思是“观点证明”。这个短语会在漏洞报告中使用,漏洞报告中的POC则是一段说明或者一个攻击的样例,使得读者能够确认这个漏洞是真实存在的。
2.EXP(Exploit),中文意思是“漏洞利用”。意思是一段对漏洞如何利用的详细说明或者一个演示的漏洞攻击代码,可以使得读者完全了解漏洞的机理以及利用的方法。
3.VUL(Vulnerability),泛指漏洞。
4.CVE漏洞编号,CVE 的英文全称是“Common Vulnerabilities & Exposures”公共漏洞和暴露,例如CVE-2015-0057、CVE-1999-0001等等。CVE就好像是一个字典表,为广泛认同的信息安全漏洞或者已经暴露出来的弱点给出一个公共的名称。如果在一个漏洞报告中指明的一个漏洞,如果有CVE名称,你就可以快速地在任何其它CVE兼容的数据库中找到相应修补的信息,解决安全问题。
可以在https://cve.mitre.org/网站根据漏洞的CVE编号搜索该漏洞的介绍。
也可以在中文社区http://www.scap.org.cn/上搜索关于漏洞的介绍
5.0DAY漏洞和0DAY攻击
在计算机领域中,零日漏洞或零时差漏洞(英语:Zero-dayexploit)通常是指还没有补丁的安全漏洞,而零日攻击或零时差攻击(英语:Zero-dayattack)则是指利用这种漏洞进行的攻击。提供该漏洞细节或者利用程序的人通常是该漏洞的发现者。零日漏洞的利用程序对网络安全具有巨大威胁,因此零日漏洞不但是黑客的最爱,掌握多少零日漏洞也成为评价黑客技术水平的一个重要参数。
零日漏洞及其利用代码不仅对犯罪黑客而言,具有极高的利用价值,一些国家间谍和网军部队,例如美国国家安全局和美国网战司令部也非常重视这些信息[1]。据路透社报告称美国政府是零日漏洞黑市的最大买家。
23.3 文件上传实战思路
1.上传文件和文件执行是两个东西
2.漏洞分类{解析漏洞、cms漏洞、其他漏洞【编辑器漏洞、cve漏洞、安全修复】}
思路:
如果有一个网站,要从文件上传的方向开始
第一步:先看中间件,看是否存在解析漏洞/CMS/编辑器漏洞/CVE/
如果有,如何找:
字典扫描:扫描会员中心,文件上传的位置
找到后,如何利用:
验证/绕过
涉及资源
https://navisec.it/编辑器漏洞手册/
📎web中间件常见漏洞总结.pdf
2019通达oa安装文件:https://pan.baidu.com/s/1eLjH_88fhXAw3ZwE7kVRbA 提取码:ywek
P24.文件上传之 WAF 绕过及安全修复
前言
了解原理之后,尝试使用所学知识进行绕过waf。以及了解文件上传漏洞的安全修复
知识总览
上传参数名解析:明确哪些东西能修改?
Content-Disposition:一般可更改
name:表单参数值,不能更改
filename:文件名,可以更改
Content-Type:文件 MIME,视情况更改
常见绕过方法:
数据溢出-防匹配(xxx…)
符号变异-防匹配(’ " ;)
数据截断-防匹配(%00 ; 换行)
重复数据-防匹配(参数多次)
Payload
大量垃圾数据缓冲溢出(Content-Disposition,filename 等)
filename=x.php
filename="x.php
filename='x.php
filename="a.jpg;.php";
filename="a.php%00.jpg"
filename="Content-Disposition: form-data; name="upload_file";x.php" filename="x.jpg";filename="x.jpg";.....filename="x.php";
filename="xxx/x.jpg"
filename=
"
x
.
p
h
p
"
文件上传安全修复方案
1. 后端验证:采用服务端验证模式
2. 后缀检测:基于黑名单,白名单过滤
3. MIME 检测:基于上传自带类型检测
4. 内容检测:文件头,完整性检测
5. 自带函数过滤:参考 uploadlabs 函数
6. 自定义函数过滤:function check_file(){}
7. WAF 防护产品:宝塔,云盾,安全公司产品等
总结
#上传参数名解析:
明确哪些东西能修改?
Content-Disposition:一般可更改
name:表单参数值,不能更改
filename:文件名,可以更改
Content-Type:文件MIME,视情况更改
#常见绕过方法:
数据溢出-防匹配(xxx...) :就是在关键点前面写入大量的无用数据来干扰对后面主要数据的检测
符号变异-防匹配(' " ; ):有的检测可能是基于单引号和双引号来获取数据,可以修改单引号或双引号的位置或增加删除单双引号来干扰waf
数据截断-防匹配(%00; 换行):
重复数据-防匹配(参数多次)
#Payload :
大量垃圾数据缓冲溢出(Ccontent-Disposition,filename等)
#单引号、双引号、分号
filename=x.php
filename="x.php
filename='x.php
filename="a.jpg;.php";
# %00、换行
filename="a.php%00.jpg"
filename="Content-Disposition : form-data;name="upload_file" ; x.php"
filename="x.jpg" ; filename="x.jpg" ; . . . ..filename="x.php";
filename=
"
x
.
p
h
p
"
;
- ;截断
- 重复参数
- 借助白名单,在filename内写入前面的一些数据,最后再写入x.php,程序判定filename时发现有前面的数据就放行,遇到x.php后发现没有变量接收,然后放弃检测,但最后x.php上传给了filename
- /截断
#文件上传安全修复方案
后端验证:采用服务端验证模式后缀检测:
基于黑名单,白名单过滤M工ME检测:
基于上传自带类型检测
内容检测:文件头,完整性检测
自带函数过滤:参考uploadlabs函数
自定义函数过滤:function check_file(){ }
WAF防护产品:宝塔,云盾,安全公司产品等
涉及资源
fuzzdb:https://github.com/fuzzdb-project/fuzzdb
fuzzDits:https://github.com/TheKingOfDuck/fuzzDicts
fuzz及爆破字典:https://github.com/Ivan52/fuzz_dict
案例演示
WAF 绕过简单演示
参考:
小迪安全:https://www.bilibili.com/video/BV1JZ4y1c7ro?p=6 0x00实验室:https://www.yuque.com/weiker/xiaodi/kdf52h 小迪安全笔记:https://www.yuque.com/samxara/swro13/wk5w9t
|