PHPYUN任意文件上传导致GETSHELL

2016-03-31T00:00:00
ID SSV:94001
Type seebug
Reporter Root
Modified 2016-03-31T00:00:00

Description

简要描述:

简单到你难以想象,只要网站还可以注册就可以GETSHELL,无视GPC,无视WAF。4.1beta版本,其他版本未测

详细说明:

1.在审计PHPYUN的时候一度对PHPYUN的WAF非常无语,但是在大家都痴迷于寻找SQL注入漏洞的时候,确实忽略了一个很简单的上传漏洞。首先定位到漏洞文件wap/member/model/index.class.php

function photo_action(){ if($_POST['submit']){ preg_match('/^(data:\s*image\/(\w+);base64,)/', $_POST['uimage'], $result); $uimage=str_replace($result[1], '', str_replace('#','+',$_POST['uimage'])); $new_file = time().".".$result[2]; if (!file_exists(DATA_PATH."upload/user/".date('Ymd')."/")){ mkdir(DATA_PATH."upload/user/".date('Ymd')."/"); chmod(DATA_PATH."upload/user/".date('Ymd')."/",0777); } $re=file_put_contents(DATA_PATH."upload/user/".date('Ymd')."/".$new_file, base64_decode($uimage)); chmod(DATA_PATH."upload/user/".date('Ymd')."/".$new_file,0777); if($re){ $user=$this->obj->DB_select_once("resume","`uid`='".$this->uid."'","`photo`,`resume_photo`"); if($user['photo']||$user['resume_photo']){ unlink_pic(APP_PATH.$user['photo']); unlink_pic(APP_PATH.$user['resume_photo']); } $photo="./datahttps://images.seebug.org/upload/user/".date('Ymd')."/".$new_file; $this->obj->DB_update_all("resume","`resume_photo`='".$photo."',`photo`='".$photo."'","`uid`='".$this->uid."'"); $this->obj->DB_update_all("resume_expect","`photo`='".$photo."'","`uid`='".$this->uid."'"); echo 1;die; }else{ unlink_pic("../datahttps://images.seebug.org/upload/user/".date('Ymd')."/".$new_file); echo 2;die; } } else{ $user=$this->obj->DB_select_once("resume","`uid`='".$this->uid."'","`photo`"); if($user['photo']==""){ $user['photo']='/'.$this->config['sy_member_icon']; } $this->yunset("user",$user); $this->waptpl('photo'); } }

2.这里的file_put_contents接收两个参数,两个参数均是来自于$_POST['uimage'],而且还经过了base64_decode的反编码,就可以无视WAF了。首先注册一个普通的用户,随便填一个简历,然后构造payload,如测试代码,就可以在我们的根目录下面生成一个php的一句话webshell。 官网没找到demo,就以官网中的排名第一个的案例http://.../(电商人才网)演示漏洞 参照测试代码,构造payload,你以为最后的时间戳还要爆破么,完全不用,使用burp抓包(不能直接访问,除非你是用手机访问的,因为这里验证了UA头,是电脑会被重定向,但是后面的代码仍然可以执行),访问http://.../wap/member/index.php?c=photo&m=index(这里不post任何数据,就可以直接看到当前的头像,里面有我们传好的webshell)

<img src="https://images.seebug.org/upload/201603/3021521945b7658d9faeec85a4ae051f957d4027.png" alt="1.png" width="600" onerror="javascript:errimg(this);">

http://.../datahttps://images.seebug.org/upload/user/20160330/1459344569.php 3,同样的问题还出现在wap/member/model/com.class.php。

漏洞证明:

<img src="https://images.seebug.org/upload/201603/3021521945b7658d9faeec85a4ae051f957d4027.png" alt="1.png" width="600" onerror="javascript:errimg(this);">

http://.../datahttps://images.seebug.org/upload/user/20160330/1459344569.php 按照管理员大大的要求再提供案例吧,都只传phpinfo,没问题吧 1.http://.../datahttps://images.seebug.org/upload/user/20160331/1459407471.php 2.http://.../datahttps://images.seebug.org/upload/user/20160331/1459407615.php 3.http://.../datahttps://images.seebug.org/upload/user/20160331/1459407983.php 4.http://.../datahttps://images.seebug.org/upload/user/20160331/1459408176.php 5.http://.../datahttps://images.seebug.org/upload/user/20160330/1459344569.php 6.http://.../datahttps://images.seebug.org/upload/user/20160331/1459408409.php