upload-labs-env文件上传漏洞 11-19关

Pass-11

源码:加上了本人的注释=。=

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');//文件的后缀
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1); //获取文件的后缀名 在.的位置+1
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name']; //获取临时上传文件的名称
        $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext; //获取上传文件最重要保存在哪个目录加了个/和随机数字和日期

在源码中可以看到,除了白名单的三种后缀别的后缀都不可以上传,然后这次用到的绕过方式为00绕过

00绕过的原理为: 00截断是16进制的00   当操作系统在读文件名的时候在读到00的时候他认为这个文件就结束了,后面有再多的东西也没有用

那么我们就上传一个木马文件,改为jpg格式,然后再路径里面添加一个php文件后面加%00

最上传的文件为1.php  然后连接就好

Pass-12

源码:

$is_upload = false;
$msg = null;
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)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

源码跟11关没有什么本质的区别,只不过就是这关采用了POST的形式上传

 同样是上传shell.jpg的文件,在文件路径添加一个1.php.jpg不写00

然后到HEX里面找到16进制的1.php.jpg,在.jpg的.这里把他的16进制改为00,然后上传就成功了。

Pass-13

源码

function getReailFileType($filename){
    $file = fopen($filename, "rb");
    $bin = fread($file, 2); //只读2字节
    fclose($file);
    $strInfo = @unpack("C2chars", $bin);    
    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);    
    $fileType = '';    
    switch($typeCode){      
        case 255216:            
            $fileType = 'jpg';
            break;
        case 13780:            
            $fileType = 'png';
            break;        
        case 7173:            
            $fileType = 'gif';
            break;
        default:            
            $fileType = 'unknown';
        }    
        return $fileType;
}

源码的整体大概意思就是只读取文件头的前两个字节,前两个字节符合上传的三种文件格式即可。

那么我们只需要上传shell.php在内容的头部加入三种格式的文件头即可。

GIF   GIF 89A

JPEG(JPG)    FFD8FF

PNG    89504E87

GIF    47494638

然后就上传成功了,你写的什么格式的文件头,上传的就是什么格式

那么这里就需要文件包含来进行连接了,然而我的靶机里面没有文件包含,所以我就自己写了一个

<?php
header("Content-Type:text/html;charset=utf-8");
$file=$_GET['file'];
if(isset($file)){
    include $file;
}else{
    show_source(__file__);
}
?>

然后访问文件包含漏洞的文件:localhost/baohan.php?file=图片马路径    即可连接

Pass-14

源码于13大同小异,只不过判断的方式不同

这里我选择的是插入图片马

在dos里输入  copy 1.jpg/b+shell.php 2.jpg

然后生成了一个2.jpg的图片马

上传上去,用文件包含连接即可

Pass-15 使用了exif_imagetype的判断方式

  同13 14

Pass-16

源码

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])){
    // 获得上传文件的基本信息,文件名,类型,大小,临时文件路径
    $filename = $_FILES['upload_file']['name'];
    $filetype = $_FILES['upload_file']['type'];
    $tmpname = $_FILES['upload_file']['tmp_name'];

    $target_path=$UPLOAD_ADDR.basename($filename);

    // 获得上传文件的扩展名
    $fileext= substr(strrchr($filename,"."),1);

    //判断文件后缀与类型,合法才进行上传操作
    if(($fileext == "jpg") && ($filetype=="image/jpeg")){
        if(move_uploaded_file($tmpname,$target_path))
        {
            //使用上传的图片生成新的图片
            $im = imagecreatefromjpeg($target_path);

            if($im == false){
                $msg = "该文件不是jpg格式的图片!";
            }else{
                //给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()).".jpg";
                $newimagepath = $UPLOAD_ADDR.$newfilename;
                imagejpeg($im,$newimagepath);
                //显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = $UPLOAD_ADDR.$newfilename;
                unlink($target_path);
                $is_upload = true;

16关这里使用了一个二次渲染的过滤,也就是把你上传的图片打碎重组生成新的图片

这里如果我们用自己生成的图片马的话,会把你的恶意代码删除。

使用winhex工具,在中间随意位置写入16进制的恶意代码,然后上传。

Pass-17

猜你喜欢

转载自www.cnblogs.com/liujizhou/p/11839108.html