WEB安全

如何挖掘任意文件上传漏洞

字号+ 作者:sqler 来源:转载 2016-11-24 20:22 我要评论( )

如何挖掘任意文件上传漏洞 0x01前言 不想说其他的,发这篇文章就是看坏蛋不爽。 0x02什么是 任意文件上传漏洞 由于文件上传功能实现代码没有严格限制用户上传的文......

如何挖掘任意文件上传漏洞

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


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


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


0x04  实战的案例(白盒测试)
PHPEMS V3.1   (喷子喷之前请下载看看,如果有问题,欢迎指点)
    phpems3.1/app/document/api.php
  1. public function uploadfile()
  2.         {
  3.                 $fn = $this->ev->get('CKEditorFuncNum');
  4.                 $upfile = $this->ev->getFile('upload');
  5.                 $path = 'files/attach/files/content/'.date('Ymd').'/';
  6.                 if($upfile)
  7.                 $fileurl = $this->files->uploadFile($upfile,$path,NULL,NULL,$this->allowexts);
  8.                 if($fileurl)
  9.                 {
  10.                         $message = '上传成功!';
  11.                         $args = array();
  12.                         $args['attpath'] = $fileurl;
  13.                         $args['atttitle'] = $upfile['name'];
  14.                         $args['attext'] = $this->files->getFileExtName($upfile['name']);
  15.                         $args['attsize'] = $upfile['size'];
  16.                         $args['attuserid'] = $this->_user['sessionuserid'];
  17.                         $args['attcntype'] = $upfile['type'];
  18.                         $this->attach->addAttach($args);
  19.                         $str = '<script type="text/javascript">window.parent.CKEDITOR.tools.callFunction('.$fn.', \''.WP.'/'.$fileurl.'\', \''.$message.'\');</script>';
  20.                 }
  21.                 else
  22.                 {
  23.                         $message = '上传失败,附件类型不符!';
  24.                         $str = '<script type="text/javascript">window.parent.CKEDITOR.tools.callFunction('.$fn.',false, \''.$message.'\');</script>';
  25.                 }
  26.                 echo $str;
  27.         }
  28.  
  29.         public function swfupload()
  30.         {
  31.                 $path = 'files/attach/images/content/'.date('Ymd').'/';
  32.                 $upfile = $this->ev->getFile('Filedata');
  33.                 if($upfile)
  34.                 $fileurl = $this->files->uploadFile($upfile,$path,NULL,NULL,$this->allowexts);
  35.                 if($fileurl)
  36.                 {
  37.                         $args = array();
  38.                         $args['attpath'] = $fileurl;
  39.                         $args['atttitle'] = $upfile['name'];
  40.                         $args['attext'] = $this->files->getFileExtName($upfile['name']);
  41.                         $args['attsize'] = $upfile['size'];
  42.                         $args['attuserid'] = $this->_user['sessionuserid'];
  43.                         $args['attcntype'] = $upfile['type'];
  44.                         $this->attach->addAttach($args);
  45.                         if($this->ev->get('imgwidth') || $this->ev->get('imgheight'))
  46.                         {
  47.                                 if($this->files->thumb($fileurl,$fileurl.'.png',$this->ev->get('imgwidth'),$this->ev->get('imgheight')))
  48.                                 $thumb = $fileurl.'.png';
  49.                                 else
  50.                                 $thumb = $fileurl;
  51.                         }
  52.                         else
  53.                         $thumb = $fileurl;
  54.                         exit(json_encode(array('status' => 'succ','thumb' => $thumb)));
  55.                 }
  56.                 else
  57.                 {
  58.                         exit(json_encode(array('status' => 'fail')));
  59.                 }
  60.         }
  61.  
  62. 上传的时候,调用uploadfile函数
  63.  
  64. public function uploadFile($file,$updir,$**tension = NULL,$name = NULL)
  65.         {
  66.                 if(!$**tension)$**tension = $this->getFileExtName($file['name']);
  67.                 if(!$name)$name = time().rand(1000,9999);
  68.                 if(!file_exists($updir))$this->mdir($updir);
  69.                 $url = $updir.$name.'.'.$**tension;
  70.                 if(file_exists($url))unlink($url);
  71.                 move_uploaded_file( $file['tmp_name'], $url ) ;
  72.                 if (file_exists($url))
  73.                 {
  74.                         $oldumask = umask(0) ;
  75.                         chmod( $url, 0777 ) ;
  76.                         umask( $oldumask ) ;
  77.                 }
  78.                 return $url;
  79.         }
复制代码
    可以看出来,这里对文章的类型没有做任何判断,直接进行上传


    这里拿官方demo测试,随便注册一个账号
    到个人信息处,上传头像。修改文件后缀为php

        在返回包查看返回的路径
   
    然后我们访问我们的shell
   
    这里推荐下i春秋的任意文件上传的课程,挺不错,还有解析漏洞,有兴趣的可以看一下。






0x05  实战的案例(黑盒测试)
    以某网站为例(猴子又要骂我禽兽了)
    我们先到后台
   
  弹出了这个
   
   在这儿选择上传表格,这里没有对文件进行限制,
   我们可以上传任意的文件上去,这儿我传了shell
   
   
    通过菜刀连接我们的木马,拿到webshell
   
    使用菜刀执行命令
    net user username password /add      <!--创建一个用户-->
    net localgroup administrators username /add    <!--给这个用户赋予管理员的权限-->
   
   
    然后我们连接上服务器,进了服务器可以做多少事,大家心里应该是有数的
   

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

本文来自: 蜗蜗侠's Blog-关注网络安全 http://blog.icxun.cn/Web/228.html

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
网友点评
暂时未开启评论功能~