//判断上传文件时候合法 function file_suffixal($file_suffixal,$file_size = 0){ global $my_file; if(!file_size_big($file_size)){ switch ($my_file->file_type_suffixal($file_suffixal)){ case ".jpg": break; case ".gif": break; case ".bmp": break; case ".png": break; case ".txt": break; case ".xls": break; case ".doc": break; default: echo "<script language=javascript>alert('上传的文件类型不正确');history.back(-1);</script>"; die(); break; } } }//判断上传文件大小 function file_size_big($file_size_big){ if(($file_size_big <= 0) or ($file_size_big > 1048576)){ echo "<script language=javascript>alert('请选择要上传的文件或文件应在2M以内');history.back(-1);</script>"; die(); } }
//取文件后缀 function file_type_suffixal($file_type_suffixal){ return "." . strtolower(array_pop(explode(".",$file_type_suffixal))); }
而且$_FILE["upload_file"]["type"]也一直在用。
网上的教程都是这么写的。今天才知道它原来是浏览器提供的。
http://www.php.net/manual/en/ref.exif.php
{
$file_postfix = substr($p,strrpos($p,"."));
if (!in_array($file_postfix,$FILE_POSTFIX)) //判断扩展名字
{
echo "<script language='javascript'>alert('图片格式不对!');window.history.back();</script>";
}
else
{
$fp = fopen($photo,"r");
$data = addslashes(fread($fp,filesize($photo)));
}
}
文件类型可以用$_FILE["filename"]来截断文件名获取后缀的方法判断类型.不过这也不值得信任.
这似乎要从PE文件格式来下手了.
function file_suffixal($file_suffixal,$file_size = 0){
global $my_file;
if(!file_size_big($file_size)){
switch ($my_file->file_type_suffixal($file_suffixal)){
case ".jpg": break;
case ".gif": break;
case ".bmp": break;
case ".png": break;
case ".txt": break;
case ".xls": break;
case ".doc": break;
default:
echo "<script language=javascript>alert('上传的文件类型不正确');history.back(-1);</script>";
die();
break;
}
}
}//判断上传文件大小
function file_size_big($file_size_big){
if(($file_size_big <= 0) or ($file_size_big > 1048576)){
echo "<script language=javascript>alert('请选择要上传的文件或文件应在2M以内');history.back(-1);</script>";
die();
}
}
function file_type_suffixal($file_type_suffixal){
return "." . strtolower(array_pop(explode(".",$file_type_suffixal)));
}
我这里有个*.exe文件,我把后缀改了成txt,就能骗过你的检验程序上传成功,虽然没法立刻执行,但当我某天搞到了你网站的web shell,就可以把后缀改回来,再执行这个程序了.
某天搞到了你网站的web shell,就可以把后缀改回来,再执行这个程序了.---------------------
搞到了web shell,并且能改文件,还需要再利用这个漏洞吗
刚查了一下手册
getimagesize 在php5以上返回数组
key[0] 宽
key[1] 长
key[2] 文件类型本函数不需打开GD扩展
改了文件头,它就是一个图片文件了,只不过算是损坏的图片文件
改了文件头,它就是一个图片文件了,只不过算是损坏的图片文件=========================================================同意
$_FILE["upload_file"]["type"]都可以
你说了,高手可以自己写客户端,发送木马上来,但是有一点,你怎么去执行这个web sell
如果你有能力通过客户端把.jpg 改成 .php 这是什么,这是对服务器目录有操作权限了,除非web管理员开放了php 的 rename服务,否则想通过web方式你无论如何也改不了,改不了就永远都不能执行。你说你拿下其它洞洞,再来改,我看那也没有这个必要上传啦,所以说php是较安全的呢!
取得图片的长宽。语法: array getimagesize(string filename, array [imageinfo]);返回值: 数组函数种类: 图形处理
内容说明
本函数可用来取得 GIF、JPEG 及 PNG 三种 WWW 上图片的高与宽,不需要安装 GD library 就可以使用本函数。返回的数组有四个元素。返回数组的第一个元素 (索引值 0) 是图片的高度,单位是像素 (pixel)。第二个元素 (索引值 1) 是图片的宽度。第三个元素 (索引值 2) 是图片的文件格式,其值 1 为 GIF 格式、 2 为 JPEG/JPG 格式、3 为 PNG 格式。第四个元素 (索引值 3) 为图片的高与宽字符串,height=xxx width=yyy。可省略的参数 imageinfo 用来取得一些图片的相关信息,例如 IPTC (http://www.xe.net/iptc) 的 APP13 标记,就可以加在图片中,可利用 iptcparse() 来解析。