攻防

前段时间,公司几年前开发的站点受到了攻击,不是SQL注入的攻击,而是aspxspy的攻击,这是一个ASP的页面,以运行CmdShell的方式来获取服务器的信息,但是以后缀名为jpg的文件保存,将其伪装成图片上传至服务器,然后就开始读取服务器上的所有信息,如果在开发的时候就对服务器上各个文件夹的权限做了详细的设置的话,这个程序倒是没有权限去更改服务器上的文件,但是发生这种情况最根本的源头就是未对上传的文件类型做判断,不是简单的去判断文件的后缀名,而是进一步的判断某一文件是否为允许上传的文件类型,具体针对图片的判断其实很简单,用下面的代码就可以简单解决:

private bool IsImage(string filePath)
        {
            Image image;
            try
            {
                image = Image.FromFile(filePath);
                image.Dispose();
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

PHP 图片上传,如果不做任何判断的话,随便一个文件如 rar,zip,php,java等文件改个文件名,改个后缀就能以图片形式上传的服务器,往往会造成极大的危害!

第一种方法:如果是只是单纯判断是否是图片格式的话,我使用  getimagesize 方法

    function checkIsImage($filename){   
          $alltypes = '.gif|.jpeg|.png|.bmp';//定义检查的图片类型    
          if(file_exists($filename)){        
            $info= getimagesize($filename);        
            $ext = image_type_to_extension($info['2']);        
              return stripos($alltypes,$ext);    
          }else{        
              return false;   
          }
       }   

    if(isImage('test.jpg')!==false){
            echo '是图片';
          }else{
             echo '不是';
          }

    第二种方法比较强大一些,能判断多种格式

    function getReailFileType($filename){    
        $file    = fopen($filename, "rb");    
        $bin    = fread($file, 2); //只读2字节    
        fclose($file);    
        $strInfo    = @unpack("C2chars", $bin);   
        $typeCode    = intval($strInfo['chars1'].$strInfo['chars2']);    
        $fileType    = '';    
        switch($typeCode){        
            case 7790:            
            $fileType = 'exe';
            break;        
            case 7784:            
            $fileType = 'midi';
            break;        
            case 8297:            
            $fileType = 'rar';
            break;        
            case 255216:            
            $fileType = 'jpg';
            break;        
            case 7173:           
            $fileType = 'gif';
            break;        
            case 6677:            
            $fileType = 'bmp';
            break;        
            case 13780:            
            $fileType = 'png';
            break;        
            default:            
            $fileType = 'unknown';    
          }    
          return $fileType;
        }

    第三种方法:

    PHP  gd类库函数提供了一个exif_imagetype() 函数, 用来读取图像的第1个字节, 还会对图片的签名做检查。 如果格式不对,会返回false。 其实啊, 这个方法和第一种方法有异曲同工之妙。 但是因为这个是库函数,效率要比第一种方法高得多。此函数用法很简单,传入路径,然后通过判断是否等于某个常量,  例如 gif格式的IMAGETYPE_GIF
    if(exif_imagetype("image.gif")!=IMAGETYPE_GIF){
          echo "The picture is not a gif";
        }

    第四种方法:php重绘

    效率很低的一种方法,但也是一种思路: 把传输过来的文件,不论什么文件都以resource 类型绘到图片中去, 如果是图片,能还原出来。如果不是图片,那绘画不出来,而且里面的危险代码也没有了。

    具体请看:
        function isimage($imgpath){
            if($imgpath['type']=="image/gif")
              $img=imagecreatefromgif($imgpath['tmp_name']);
            elseif($imgpath['type']=="image/png" || $imgpath['type']=="image/x-png")
              $img=imagecreatefrompng($imgpath['tmp_name']);
            else
              $img=imagecreatefromjpeg($imgpath['tmp_name']);
              if($img==false){
                return false;
              }else{
                return true;
              }
        }

   第五种方法:把二进制的图片转换成十六进制的


   

    总结: 我曾经在网上看到过有人说:相信懂得php的人都用过XX函数。 我打开一看,就是一个使用后缀来判断上传类型的函数。 同学在做类似功能的时候一定要揭开表现看到本质,否则经过伪装的图片在上传之后,会对服务器造成极大安全隐患。

发布了66 篇原创文章 · 获赞 2 · 访问量 4665

猜你喜欢

转载自blog.csdn.net/converoscar/article/details/103976026
今日推荐