Maison développement back-end tutoriel php 有一段图片上传验证,高分帮小弟我找漏洞

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

Jun 13, 2016 am 10:07 AM
name php quot

有一段图片上传验证,高分帮我找漏洞
我的一个小网站http://hitaow.sinaapp.com中有一段代码,下面是一段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文件伪装成图片文件,肯定可以绕过。

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
4 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Configuration du projet CakePHP Configuration du projet CakePHP Sep 10, 2024 pm 05:25 PM

Dans ce chapitre, nous comprendrons les variables d'environnement, la configuration générale, la configuration de la base de données et la configuration de la messagerie dans CakePHP.

Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

Date et heure de CakePHP Date et heure de CakePHP Sep 10, 2024 pm 05:27 PM

Pour travailler avec la date et l'heure dans cakephp4, nous allons utiliser la classe FrozenTime disponible.

Téléchargement de fichiers CakePHP Téléchargement de fichiers CakePHP Sep 10, 2024 pm 05:27 PM

Pour travailler sur le téléchargement de fichiers, nous allons utiliser l'assistant de formulaire. Voici un exemple de téléchargement de fichiers.

Routage CakePHP Routage CakePHP Sep 10, 2024 pm 05:25 PM

Dans ce chapitre, nous allons apprendre les sujets suivants liés au routage ?

Discuter de CakePHP Discuter de CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP est un framework open source pour PHP. Il vise à faciliter grandement le développement, le déploiement et la maintenance d'applications. CakePHP est basé sur une architecture de type MVC à la fois puissante et facile à appréhender. Modèles, vues et contrôleurs gu

CakePHP créant des validateurs CakePHP créant des validateurs Sep 10, 2024 pm 05:26 PM

Le validateur peut être créé en ajoutant les deux lignes suivantes dans le contrôleur.

Comment configurer Visual Studio Code (VS Code) pour le développement PHP Comment configurer Visual Studio Code (VS Code) pour le développement PHP Dec 20, 2024 am 11:31 AM

Visual Studio Code, également connu sous le nom de VS Code, est un éditeur de code source gratuit – ou environnement de développement intégré (IDE) – disponible pour tous les principaux systèmes d'exploitation. Avec une large collection d'extensions pour de nombreux langages de programmation, VS Code peut être c

See all articles