进入到linux的tmp目录里一看,很吃惊,一堆php开头的文件,如下图:

在这里插入图片描述

不知道是哪里来的,而且已经很久了。查看内容基本都是这样的:

[root@kermit tmp]# cat phpzpqXzeGIF89a<%response.Write(987651234-123498765)strURL = Request.Servervariables(“url”)intPos = InstrRev(strURL,”/”)intStrLen = len(strURL)strFileName = Right(strURL,intStrLen-intPos)on error resume nextset fs=Server.CreateObject(“Scripting.FileSystemObject”)fs.DeleteFile(Server.MapPath(“.”)&”\\”&strFileName)%>   

这是GIF89a图片头文件欺骗,是一种攻击,GIF89a图形文件是一个根据图形交换格式(GIF)89a版进行格式化之后的图形。而写到这个临时目录说明是通过上传进入到了这个目录,这个文件会怎么执行呢?如果这个图片被存入进了WEB,在浏览器里打开并加载这个图片时就会出现异常,比如编写一个text文件,内容如下:

GIF89a<head>

<meta http-equiv = “refresh” content =”1;url=http://www.sohu.com/” />  </head>

然后保存成名字:a.gif。再在PHP的WEB目录下创建一个img.php文件,里面写上代码:<img src=”a.gif”> 然后访问img.php文件,你会看到页面打开后不久就跳转至搜狐网站了,如果a.gif的文件里跳转时再带上一些读取cookies的参数,那么用户的数据就被窃取了!

我们使用php里的函数getimagesize读取这张图片,会得到这样的结果:Array([0] => 2573[1] => 26684[2] => 1[3] => width=”2573″ height=”26684″[channels] => 3[mime] => image/gif)

结果显示图片的类型是没问题的,只是在尺寸上有些大,但也许这种注入有其它的办法能将尺寸修改成符合你网站需要的,那PHP在接收图片时有什么办法来阻止这种方式呢?既然getimagesize从图片类型上不能阻止,其它的函数:mime_content_type,Fileinfo也没法阻止了。当然如果攻击的脚本像上面这种完全可以从尺寸上阻止,如果脚本能通过,可以考虑重新将图片生成的方法防止含代码图片进入,

程序如下:

//显示php获取的图像信息print_r(getimagesize(‘a.gif’));
//如果尺寸合格, 重新创建图像实例$img = getimagesize(‘a.gif’);$im = imagecreatetruecolor ($img[0], $img[1]);imagepng ($im , ‘./a.’.image_type_to_extension (IMAGETYPE_PNG));imagedestroy($im);    

这时如果像上面这种脚本上传,重新生成的图片会是一张纯黑图片,也就不存在攻击脚本了。但这样也会带来额外的图片生成开销。

Logo

更多推荐