XSS前端防火墙内置拦截
核心提示:有无数的讨论XSS是形成的,如何被注入,能做什么,以及如何防止它。几乎每一篇关于XSS,最后究竟会如何防止,但大多是相同的。什么改变什么,滤波器…已经有无数的讨论XSS是形成的,如何被注入,能够做什么和如何防止它,它不再是这里描述。
几乎每一篇关于XSS,最后究竟会如何防止,但大多是相同的。怎么办,怎么过滤,和忘记什么,虽然都知道,XSS漏洞从未中断超过十年。有许多大型网站经常被打破。小型网站更为频繁。
本文介绍了一个预防思想mdash;mdash;通过前端监控脚本,每个用户参与的漏洞披露。
预警系统
事实上,没有一个漫长而容易的解决办法,以避免它仍然使用最古老的土壤方法,并逐一过滤它,然而,当人们总是疏忽时,每当产品被重复更新,不可避免地会遗漏一些新的领域,从而导致漏洞的引入。
即使有一千的担心圣徒,bug的程序完全可以理解,在线及时修复。但令人不解的是,这个问题似乎被发现,但这需要很长的时间。例如,例如XSS蠕虫脚本,直到不久后大疫情报告的用户。其他大部分网站都是类似的,直到白帽子挖孔和提交给安全平台,和最终的供应商告诉。如果黑客把这些漏洞在私人的,它只能被杀死。
因此,如果您可以有一个实时的预警系统,那么即使我们不能防止漏洞的发生,我们也可以在漏洞触发的第一时间通知开发者,我们可以在最短的时间内修复它们,并尽量减少损失,同时也会产生各种应用层防火墙。
然而,不同于传统的系统漏洞,XSS是最终用户的页面引起的。因此,我们不妨尝试使用前端的想法网络防御。
XSS内联事件
首先,假设一个后台漏洞不处理输入数据非常好,导致XSS注入页:
在XSS攻击是最常见的,只有尖括号都忘记了,但报价都忘记。攻击者可以提前封闭性质,并添加一个容易引发内联事件,跨站点脚本很容易执行。
那么,我们可以使用前端脚本来捕获甚至拦截吗
被动扫描
最简单的方法是扫描页面中的所有元素,并在on开始时检查内联属性,看看是否有异常。
例如,字符的数量是非常大的,这是罕见的在正常情况下,但XSS有时代码以避免逃逸。例如,有经常被XSS一些关键词,但是他们很难用于实际产品。这些可以作为一个脆弱的迹象,并通知开发商。
然而,土方法到底有着很大的局限性。在清代的Ajax时代,页面元素是不固定的,与用户的互动,可以动态添加新的内容在任何时间,即使是改为定期扫描一次,XSS可以触发的定时器间隔和自我毁灭,所以它不能被跟踪。此外,频繁扫描对性能影响很大。
早在安全软件上每隔几秒钟扫描一次注册表启动项,不仅性价比高,而且恶意软件也很少或没有效果;但主动防御系统不同后,只有真正的调用API来分析直接拦截,完全避免遗漏间隔计时器。
因此,我们需要这种类似的延迟策略研究,mdash;只有当XSS即将触发,它会分析和块或释放,不符合政策的要素,并发送报警日志的背景。
主动防御
积极防御,但不难发现这只是一个优先事项。mdash;mdash;只要防御程序可以运行在其他程序中,我们倡议前进和撤退。这些概念可以发挥出非常强大的HTML5和灵活的# 106avascript。
回到你刚才讨论的内联事件,XSS。浏览器不提供接口操纵内联内联事件,但事件的本质仍然是一个事件。不管它们如何变化,DOM事件模型都是不可或缺的。
当涉及到的模型,一切都会解决的。模型是解决问题的最可靠的解决方案,尤其是长期建立的模型,如dom-3-event,其稳定性是毋庸置疑的。
即使没有官方文件,仔细阅读,有谁做过网页,知道有一个老attachevent addEventListener接口。虽然只增加一个新的参数,它是不同的,成为一个热门的话题。每当接受采访时谈到的一个事件,它始终是一个问题,对这一新参数的使用,在日常开发中很少使用。
关于事件捕获和冒泡的细节没有详细讨论。下面的代码可能会激发您对主动防御的想象。
点击我
Document.addEventListener(听到咔哒声,功能(e){
console.log(‘泡沫');
});
Document.addEventListener(听到咔哒声,功能(e){
console.log(捕获的);
/ / e.stopimmediatepropagation();
},真的);
运行
虽然内联事件直接与按钮绑定,但事件模型不需要购买帐户,还必须经过标准过程。
但是,该行注释的代码被恢复,结果只被捕获。这个简单的真理被理解,没有什么可以解释的。
但仔细想想,这是主动防御的概念吗捕获程序在引发内联事件之前运行,并且完全能够拦截调用。
上面的演示只是不假思索地截取了所有事件,如果我们再加一些策略性的判断,可能会更清楚。
点击我
Document.addEventListener(听到咔哒声,功能(e){
console.log(‘泡沫');
});
Document.addEventListener(听到咔哒声,功能(e){
VaR元= e.target;
VaR代码= element.getattribute('onclick);
如果( / / XSS。测试(代码)){
e.stopimmediatepropagation();
console.log('intercepting可疑事件:',代码);
}
},真的);
运行
我们首先在捕获阶段扫描内联事件字符。如果关键词XSS出现,随后的事件被封锁。如果将其转换为其他字符,它将继续执行。同样,我们也可以确定字符长度是否太多,而更详细的黑白列表是正常的。
嗯,一个主动防御的原型诞生了。
然而,有在上面的部分,这是一个小问题,鼓泡过程的事件也被屏蔽了,我们只是想拦截内联事件。解决的办法是太简单的改变e.stopimmediatepropagation()()为element.onclick = null。
目前,这当然只能保护我,和在现实中有太多的内联事件。鼠标、键盘、触摸屏、网络状态等。不同的浏览器支持不同的事件,甚至是私人事件。是否应该逐一列出并提前捕获是的,他们都可以被捕获,但他们不必提前列出。
因为我们监测的文档对象,所有的浏览器内部事件对应的document.onxxx属性,所以我们只需要运行文档对象在运行时把所有的事件名称。
功能hookevent(事件){
Document.addEventListener(onevent.substr(2),功能(e){
VaR元= e.target;
如果(element.nodetype!=节点。element_node){
返回;
}
VaR代码= element.getattribute(事件);
如果(代码 / / XSS。测试(代码)){
元{事件} = null;
警报('intercepting可疑事件:',代码);
}
},真的);
}
console.time(时间消耗);
对于(文档中的VaR K){
如果(测试(k)){
/ / console.log(采用:,k);
HookEvent(K);
}
}
Console.timeEnd(时间消耗);
运行
现在,无论页面中的哪个元素触发内联,我们都可以预先捕获,并可以根据策略返回。
性能优化
或许有些事情不需要捕捉,如视频播放、音量控制等,但都可以不花太多的时间,基本上约1ms。
当然,注册事件不会有太多的时间,真正的成本是在回调中计算的,虽然大多数事件不会频繁触发,但是额外的扫描可以被忽略,但是与鼠标移动相关的事件是不可忽视的,所以我们必须考虑性能优化。
显然,内联事件代码几乎不可能在运行过程中的变化,使用内联事件大多是简单的,如果你想在运行时将改变内联代码,这是完全不合理的。所以,我们只需要扫描一个元素的特定事件,它可以扫描一次。然后根据标志,你可以直接跳。
事实上,标记位不需要使用事件名称,而不使用重复序列号。
功能hookevent(事件,eventhash){
功能scanelement(元){
跳过 / /扫描事件
VaR的旗帜=元{ '_flag};
如果(!旗){
标志=元{ '_flag} = { };
}
如果(typeof旗帜eventhash } {!= 'undefined){
返回;
}
{ } =真eventhash旗帜;
如果(element.nodetype!=节点。element_node){
返回;
}
VaR代码= element.getattribute(事件);
如果(代码 / / XSS。测试(代码)){
元{事件} = null;
警报('intercepting可疑代码,代码:);
}
扫描父元素
scanelement(元。parentNode);
}
Document.addEventListener(onevent.substr(2),功能(e){
scanelement(e.target);
},真的);
}
var I=0;
对于(文档中的VaR K){
如果(测试(k)){
HookEvent(K,我+ +);
}
}
运行
这样,后续的扫描仅仅是对目标对象中标记的判断。即使鼠标疯了,CPU的使用也被忽略了。
在这里,在XSS内联事件,我们已经实现了主动防御。
对于大量的字符,或类似的string.fromcharcode美元。getscript,典型的XSS代码,它可以截获;发现警报( / / XSS)、报警(123)的测试代码,你可以暂时释放,并将日志发送到背景,确定是否重现。
如果它回来了,它表明,人们发现XSS已经成功注入,但尚未开始大规模地利用它。程序猿快点来修复错误的第一时间,让一段工作的黑客发现漏洞已经修复。)
性格策略缺陷
但是,将有一个遗漏要由代码字符串来判断,尤其是黑客知道有这样一件事情会更加小心。使用代码逃避关键字并将字符存储在其他地方以避免长度检测,我们可以完全绕过我们的监视。
因此,我们不仅需要分析关键词。回调时执行的功能,如eval,setTimeout(…),等等,被称为。
然而,通常不会注入太多的代码,而是直接引入一个既简单又可靠的外部脚本,并且可以实时修改攻击的内容: