null__吧 关注:220贴子:4,305
  • 12回复贴,共1

$_FILES和getimagesize函数的不足

只看楼主收藏回复

平衡水帖~


1楼2011-07-31 09:51回复
    part 1:认识$_FILES
    <?php
    $uploaddir = 'uploadfile/';
    $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
    if(move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))
    {
    echo "<pre>";
    print_r($_FILES);
    echo "</pre>";
    }
    ?>
    bool move_uploaded_file( string filename, string destination)
    用于检查并确保由filename指定的文件是合法的上传文件(即通过 PHP 的HTTP Post上传机制所上传的),如果文件合法,则将其转为由destination指定的文件。
    输出$_FILES:
    Array
    (
    [userfile] => Array
    (
    [name] => ma.php
    [type] => application/octet-stream
    [tmp_name] => C:\WINDOWS\temp\php98.tmp
    [error] => 0
    [size] => 85827
    )
    )
    part2:$_FILES的不足
    <?php
    if($_FILES['userfile']['type'] != "image/gif") //检测文件的MIME类型,需要浏览器提供该信息的支持
    {
    echo "对不起,我们只允许上传GIF格式的图片!!";
    exit;
    }
    $uploaddir = 'uploadfile/';
    $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
    if(move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))
    {
    echo "文件是有效的, 成功上传!!!";
    } else {
    echo "文件上传错误!!!请重新上传!!!!\n";
    }
    ?>
    绕过办法:利用PHP自身的$_FILES获得type是通过数据包中的Content-Type,我们只要修改包中的Content-Type即可,改为image/gif即可上传木马。


    2楼2011-07-31 09:52
    回复



      3楼2011-07-31 09:53
      回复



        4楼2011-07-31 09:54
        回复
          part3: getimagesize函数的不足
          <?php
          $imageinfo = getimagesize($_FILES['userfile']['tmp_name']);
          if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg') {
          echo "对不起,我们只接受gif和jpeg的文件格式!!!!";
          exit;
          }
          $uploaddir = 'uploadfile/';
          $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
          if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
          echo "上传成功了!Yeah!";
          } else {
          echo "上传失败!!!";
          }
          ?>
          函数array getimagesize ( string filename [, array &imageinfo] )
          测 定任何GIF、JPG、PNG、SWF、SWC、PSD、TIFF、BMP、IFF、JP2、JPX、JB2、JPC、XBM或WBMP图像文件的大小并 返回图像的尺寸以及文件类型和一个可以用于普通HTML文件中<IMG>标记中的height/width文本字符串。
          如果不能访问filename指定的图像或者不是有效的图像,getimagesize()将返回FALSE并产生一条E_WARNING 级的错误。
          利用方法:
          找一张图片和一个php小马
          dos下执行copy /b lier.gif + lier.php lier520.php
          直接上传lier520.php即可!!这个时候的lier520.php 的content-type也是image/gif。所以也适用于part2.
          只要是将php改回gif后能用图片工具打开的木马都能通过getimagesize函数,
          这也算是getimagesize函数的不足之处吧。


          5楼2011-07-31 09:54
          回复



            6楼2011-07-31 09:55
            回复

              =====================完

              


              7楼2011-07-31 09:55
              回复

                水贴不用平衡-0-
                不然多没意思啊


                9楼2011-07-31 22:04
                回复
                  跟php上传有点关系的东西


                  10楼2011-07-31 23:05
                  回复
                    这样啊。那我还是把这个也当做水帖吧


                    11楼2011-07-31 23:05
                    回复
                      这么大的漏洞楼主有没有提交给php bugzilla


                      IP属地:上海12楼2015-06-29 11:58
                      回复
                        php上传图片的吧


                        来自Android客户端13楼2015-07-13 15:10
                        回复