❝
大家好!我是一个热衷于分享IT技术的up主。在这个公众号里,我将为大家带来最新、最实用的技术干货,从编程语言到前沿科技,从软件开发到网络安全。希望通过我的分享,能够帮助更多的小伙伴提升技术水平,共同成长!欢迎关注,一起探索科技的魅力吧!
简介
在第16关中,解决方法与第14和第15关类似,都是通过修改文件头来绕过文件上传验证。然而,第16关额外使用了 php_exif
模块对文件进行校验。因此,在尝试解决这一关时,需要确保php_exif
模块已启用,如下图所示:
❝
php_exif.dll–找不到指定的模块要想php_exif能够被成功加载,必须满足下面条件:
php_mbstring.dll
被启用;php.ini中, php_mbstring.dll
必须在php_exif.dll
前被加载。
攻击思路
下面是第16关关键源码部分:
function isImage($filename){
//需要开启php_exif模块
$image_type = exif_imagetype($filename);
switch ($image_type) {
case IMAGETYPE_GIF:
return "gif";
break;
case IMAGETYPE_JPEG:
return "jpg";
break;
case IMAGETYPE_PNG:
return "png";
break;
default:
return false;
break;
}
}
这段代码实现了一个简单的函数 isImage
,用于检查上传文件是否为图片文件。具体来说,它使用 exif_imagetype
函数来检测文件的 MIME
类型,并返回相应的文件扩展名。代码看起来直观,但仍然存在一些潜在的问题和漏洞。exif_imagetype
只检查文件的前几个字节,这意味着攻击者可以通过在恶意文件(如 PHP 脚本)前面添加几个合法图片文件的字节,来欺骗这个函数。
解法步骤
-
构造webshell脚本:
在桌面上新建一个名为webshell.php
的脚本,内容如下所示:
GIF89a
<?php phpinfo(); ?>
其中GIF89a
让webshell
脚本伪装GIF
图片绕过文件上传验证。
❝
补充知识:
Png
图片文件包括8字节:89 50 4E 47 0D 0A 1A 0A
。即为.PNG
。
Jpg
图片文件包括2字节:FF D8
。
Gif
图片文件包括6字节:47 49 46 38 39|37 61
。即为GIF89(7)a
。
Bmp
图片文件包括2字节:42 4D
。即为BM
。
上传成功后,如下图所示:
-
验证上传结果:
尝试访问上传的文件并执行命令。例如,访问 http://localhost/include.php?file=upload/2020240807164252.gif
,返回如下信息,则说明文件上传绕过成功。
总结
Upload-Lab
第16关展示了exif_imagetype
验证的局限性以及图片马技术的威力。通过这次挑战,我们可以深入理解文件上传漏洞的多样性,以及如何在攻击和防御之间找到平衡。在实际开发中,始终保持警惕并采用多层次的防御策略,才能有效抵御这类攻击。
推荐阅读
RECRUIT
关注我们
博客 | didiplus.kwpmp.cn
原文始发于微信公众号(攻城狮成长日记):Upload-Lab第16关:巧妙利用图片马方式绕过exif_imagetype验证
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论