0

0

有一段图片上传验证,高分帮小弟我找漏洞

php中文网

php中文网

发布时间:2016-06-13 10:07:11

|

1127人浏览过

|

来源于php中文网

原创

有一段图片上传验证,高分帮我找漏洞
我的一个小网站http://hitaow.sinaapp.com中有一段代码,下面是一段PHP图片上传验证的代码,有个黑客说有漏洞,帮我找下漏洞。找到给分。

php

if (is_uploaded_file($_FILES['upfile']['tmp_name'])){

$upfile=$_FILES["upfile"];

$name = $upfile["name"];
$type = $upfile["type"];
$size = $upfile["size"];
$tmp_name = $upfile["tmp_name"];
$error = $upfile["error"];

switch ($type) {
case 'image/jpg' : $ok=1;
break;
case 'image/jpeg' : $ok=1;
break;
case 'image/pjpeg' : $ok=1;
break;
case 'image/gif' : $ok=1;
break;
case 'image/png' : $ok=1;
break;
case 'image/x-png' : $ok=1;
break;
}
}
?>

if($ok && $error=='0'){
 move_uploaded_file($tmp_name,'../img/index/'.$name);
 echo "图片上传成功
";
}

if(is_uploaded_file($_FILES['upfile']['tmp_name']) && $ok!=1){
 echo "图片上传失败,上传的图片应该为:jpg jpeg gif png格式!
";
}

这段代码我也觉得有漏洞。怎么才能绕过这段验证呢。帮我找一下。

------解决方案--------------------
複製一段給你看看

作者:老王

最烂的方法就是通过$_FILES[...]['type']来检测上传文件的类型,因为只需简单修改文件扩展名就可以伪造它。

另一个相对安全点的方法是通过文件头两个字节的内容来判断上传文件的类型,例子代码如下:

01 $handle = fopen($_FILES[...]['tmp_name'], 'rb');
02 $content = fread($handle, 2);
03 fclose($handle);
04
05 $info = unpack('c2chars', $content);
06
07 if (empty($info['chars1']) || empty($info['chars2'])) {
08 exit('Error!');
09 }
10
11 if ($info['chars1'] 12 $info['chars1'] += 256;
13 }
14 if ($info['chars2'] 15 $info['chars2'] += 256;
16 }
17
18 $code = $info['chars1'] . $info['chars2'];

PHP中的pack&unpack函数很炫,有兴趣的可以看:Handling binary data in PHP with pack() and unpack()

注:网上搜索的大多数相关的程序没有做256的相关操作,这是我通过试验数据自己意淫的TDD结果,不肯定是否一定正确,读者自己斟酌。

通过switch判断$code变量,就可以对应到文件类型,常见的图片类型结果大致如下:

GIF:7173
JPG:255216
PNG:13780

当然也可以判断其他的文件类型,自己做做试验就知道数值大小了。但此方法也不是一定安全的,因为前两个字节的内容也是可以伪造的,所以最好还要限制一下文件的扩展名,以防意外的解析,比如说,你创建一个名为foobar.php的文件,内容如下:

GIF89


当你使用前两个字节去检测文件类型的时候,就会得出GIF:7173的结果,即便使用shell下的file命令去检测,一样会误认为是GIF图片:

# file foobar.php
foobar.php: GIF image data 16188 x 26736

由于扩展名是.php,那么此文件就被php引擎解析了,如此一来就给了黑客一个web shell,安全也就无从谈起了。所以说限制文件扩展名非常重要,切记!至于已经如何发现这类伪装,最简单的方法是在用shell命令过滤一遍:

# strings foobar.php | grep -i "

如果想彻底屏蔽此类危险,可以考虑使用gd,imagemagick,graphicsmagick等工具把用户上传的图片进行必要的编辑后再转存,这样就能抹去可能的嵌入代码。如果想更安全点,还应该把图片服务器独立出来,不装php,只解析静态文件。

补充:如果仅仅是判断图片的话,还有一个更简单方法,那就是getimagesize,这个方法虽然从名字上看是用来取得图片大小的,但结果里包含了图片类型,另外,虽然这个方法在文档里被归纳在GD部分,但是即便没有安装GD,也是可用的,不过和前面一样,也要注意安全问题。
------解决方案--------------------
你只判断文件的后缀 比如我上传 一个图片 1.jpg 我把后缀改为 1.php;1.jpg 你的程序会放行吗? 合格特色的后缀在iis6.0是可以当作php来解析了 如果你文件保存文件时没自动改名的话 那么漏洞就产生了
------解决方案--------------------
可以把可以执行的PHP文件伪装成图片文件,肯定可以绕过。

相关专题

更多
excel制作动态图表教程
excel制作动态图表教程

本专题整合了excel制作动态图表相关教程,阅读专题下面的文章了解更多详细教程。

20

2025.12.29

freeok看剧入口合集
freeok看剧入口合集

本专题整合了freeok看剧入口网址,阅读下面的文章了解更多网址。

65

2025.12.29

俄罗斯搜索引擎Yandex最新官方入口网址
俄罗斯搜索引擎Yandex最新官方入口网址

Yandex官方入口网址是https://yandex.com;用户可通过网页端直连或移动端浏览器直接访问,无需登录即可使用搜索、图片、新闻、地图等全部基础功能,并支持多语种检索与静态资源精准筛选。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

197

2025.12.29

python中def的用法大全
python中def的用法大全

def关键字用于在Python中定义函数。其基本语法包括函数名、参数列表、文档字符串和返回值。使用def可以定义无参数、单参数、多参数、默认参数和可变参数的函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

16

2025.12.29

python改成中文版教程大全
python改成中文版教程大全

Python界面可通过以下方法改为中文版:修改系统语言环境:更改系统语言为“中文(简体)”。使用 IDE 修改:在 PyCharm 等 IDE 中更改语言设置为“中文”。使用 IDLE 修改:在 IDLE 中修改语言为“Chinese”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

16

2025.12.29

C++的Top K问题怎么解决
C++的Top K问题怎么解决

TopK问题可通过优先队列、partial_sort和nth_element解决:优先队列维护大小为K的堆,适合流式数据;partial_sort对前K个元素排序,适用于需有序结果且K较小的场景;nth_element基于快速选择,平均时间复杂度O(n),效率最高但不保证前K内部有序。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

12

2025.12.29

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

134

2025.12.29

抖音网页版入口在哪(最新版)
抖音网页版入口在哪(最新版)

抖音网页版可通过官网https://www.douyin.com进入,打开浏览器输入网址后,可选择扫码或账号登录,登录后同步移动端数据,未登录仅可浏览部分推荐内容。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

63

2025.12.29

快手直播回放在哪看教程
快手直播回放在哪看教程

快手直播回放需主播开启功能才可观看,主要通过三种路径查看:一是从“我”主页进入“关注”标签再进主播主页的“直播”分类;二是通过“历史记录”中的“直播”标签页找回;三是进入“个人信息查阅与下载”里的“直播回放”选项。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

18

2025.12.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 10.1万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

C# 教程
C# 教程

共94课时 | 5.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号