null__吧 关注:216贴子:4,249
  • 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
                这究竟是什么意思呢?


                回复
                8楼2011-07-31 21:47

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



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


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


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


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


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