getimagesize 是PHP处理图片的函数,它的主要作用是获取图片的相关信息,如果你对这个函数不使用不是很清楚,请点击getimagesize

为什么会注意到这个函数?

要做一个检查远程CDN图片是否有效的功能,发现这个 getimagesize 函数,不仅可以打开本地的图片,还可以打开远程的图片。

但在实际使用中,发现 getimagesize 在打开远程图片的效率非常低! 通过 getimagesize 检查图片的方式非常 影响性能。 因为它 需要下载图片再检查,故不符合我们预期。遂改成,通过CURL请求 图片地址,通过检测HTTP返回状态的方式来判断。

function curl($url){
  $ch = curl_init();
  curl_setopt($ch,CURLOPT_URL, $url );
  curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  curl_setopt($ch,CURLOPT_HEADER,0);
  $output = curl_exec($ch);
  if($output === FALSE ){
      return false;
   }
  $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE) 
  curl_close($ch); 
  return $http_code === 200;
} 

上面这样就简化了流程,起到了优化的作用。移除了我不需要的下载图片和打开图片的过程,只在HTTP协议层就完成检查的功能。

技能提升

功能做完了,就停止了,那就永远就停留在业务层无法提高

getimagesize 这个函数,对于图片处理上面不仅效率低,而且还存在风险

getimagesize 是通过获取图片数据流中头部几个字节来判断图片类型的

这样就为web_shell注入 提供了机会,木马程序只需要在头部插入相关图片类型几个字节,就可以绕过 getimagesize 的检测。

攻击案例:文件上传漏洞-getimagesize检测

原理: getimagesize 函数不是完全可靠的

解决办法

这里根据业务调整就好,仁者见仁智者见智。 主要是要知道怎么造成的这个漏洞。才知道如何避免。

Leave a Reply

Your email address will not be published. Required fields are marked *