CVE-2015-2348(PHP任意文件上传漏洞)

漏洞编号:CVE-2015-2348

漏洞影响版本:PHP 5.4.38~5.6.6

漏洞成因:

        通常情况下,PHP的开发者会对文件用户上传的文件的类型、文件大小、文件名后缀等进行严格的检查来限制恶意的PHP脚本文件的上传漏洞的产生,但是攻击者有时候可以结合语言的特性以及多种绕过方法来实现文件的上传漏洞。

        该CVE漏洞的产生就是由于PHP的move_uploaded_file()函数存在逻辑缺陷所致,这个函数一般在文件上传时被调用!

move_uploaded_file ( string $filename , string $destination )

       这次的漏洞就出现在参数$destination,这个参数的是将用户上传的文件移动到最终的目的地址。如果$destionation变量是从用户$_GET或者$_POST中获取的并且我们可控,那么我们就可以利用空字符\00来截断后面的拓展名,从而造成任意文件上传。

漏洞演示:

        在本次漏洞演示的过程中我们为了方便起见就采用了DVWA漏洞演示系统来演示这个函数的漏洞,当然因为我们研究的是这个函数存在的漏洞,所以我们也可以自己写代码,来验证这一个过程(一个用于上传文件的HTML网页、一个用于验证用户上传文件是否合格的.php文件并且该文件中需要使用到move_upload_file函数即可、一个用于存放上传文件的文件夹、以及一个用于上传的PHP文件),现在想想其实第二种更加方便!哎~~~~

upload.php可以借鉴的代码

<html>
<body>
<form enctype="multipart/form-data" action="show.php" method="post">
<input name="file" type="file">
<input type="submit" value="upload">
<input type="hidden" name="address" value="1234">
</form> 
</body>
</html>

show.php代码:

<?php
 if(!empty($_FILES['file']['name'])){
     		$upload_name=$_FILES['file']['name'];
    		$type=substr($upload_name,strrpos($upload_name,'.')+1);
    		if($type == "jpg" || $type == "png" || $type == "gif"){
	        $address=$_POST['address'];
	        if (move_uploaded_file($_FILES['file']['tmp_name'],"uploads/".$address)) {
		echo "图片地址:uploads/".$address;	}}
    }
?>

下面借用DVWA来进行演示这一个漏洞:

(1)访问File Upload页面,之后设置代理:

(2)上传文件(上传一个php文件),并用burpsuite抓包

(3)使用“\00”进行截断操作

在Raw模块下修改包的内容

之后转至hex模式下截断

阶段后:

释放抓到的数据包,PHP文件成功绕过过滤实现上传!

安全建议

对于用户上传的文件我们要进行严格的检查,包括文件类型、文件名称、文件大小、文件内容等等!同时我们对于用户上传的文件应该指定一个固定的文件路径来存放文件,而不是让用户来指定该文件的存放路径,同时对于上传之后的文件名我们可以使用随机数来进行命名提高安全度。

注:此处既然可以使用“\00”来截断,那么我们除了可以上传PHP文件之外还可以上传JSP、ASP类文件,所以“任意文件上传”!一个标准的渗透测试其实到这里才算是刚刚走了一半,至于后面的上传一句话木马、提取等操作我们就不再这里演示了,本次的主要目的是验证这个PHP函数存在这样的漏洞,如果有感兴趣的,可以自我研究!同时也可以研究一下我所说的第二种漏洞复现方法!

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FLy_鹏程万里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值