一、XSS简介
XSS跨站脚本攻击(Cross Site Scripting),为了不与前端层叠样式表(Cascading Style Sheets,CSS)混淆,故将跨站脚本攻击简称为XSS。
XSS是恶意攻击者对Web页面插入恶意Script代码,当用户访问该页面时,嵌入在该Web页面中的Script代码就会被执行,从而达到恶意攻击用户的目的。XSS是目前Web安全最普遍的漏洞,也是Web攻击中最常见的攻击方式之一。
二、XSS分类
1.反射型XSS
反射型XSS也称非持久性XSS,在网页中将可控参数注入XSS代码,提交服务器端进行参数处理,但不存储,服务器端把带有XSS的数据发送到浏览器,浏览器解析、执行代码,就造成了XSS漏洞,这个过程就像是一次反射,所以叫做反射型XSS。
该类型XSS具有临时性特点。攻击者构造恶意代码,需要诱使用户“点击”恶意链接,才能攻击成功,达到窃取用户数据或冒充用户等目的。反射型XSS漏洞常见于通过URL传递参数的功能处,如网站搜索、跳转等。
2.存储型XSS
存储型XSS又称持久性XSS,存储型XSS是最危险的一种跨站脚本漏洞。
攻击者可访问网页,表单注入XSS代码后提交,服务器端接收并存储,通过网页注入的代码会被存储在数据库或其他物理文件中,当攻击者或用户再次访问网页时,被注入的XSS代码就会被程序读取出来响应给浏览器执行,造成XSS攻击,这就是存储型XSS。
该类型XSS具有持久性和稳定性的特点。存储型XSS常见于带有用户保存数据的功能处,如评论、发帖、私信等。
3.DOM型XSS
DOM型XSS是特殊类型的反射型XSS,不同于以上两种类型XSS,以上两种类型XSS属于服务器端的安全漏洞,而DOM型XSS属于前端JavaScript的安全漏洞。
通过网页可控参数注入XSS代码,提交服务器端请求页面,此时,服务器端程序不对参数数据进行处理与存储,页面返回响应后,浏览器JS才对参数数据进行处理、执行代码,造成XSS漏洞,该类型XSS也具有临时性特点。
三、XSS漏洞相关示例
1.参数未做任何过滤
以下例子为XSS Game关卡1
如下图所示,这个关卡页面简洁得只有一个搜索功能

在输入框中输入任意字符数据<"asd123?'
进行搜索,发现返回的URL中query的值与输入内容一致
故判断该网页可能未做任何过滤,于是构造可以弹出弹框的JavaScript语句
<script>alert(1)</script>
该语句与URL进行拼接,得出如下URL:
http://www.xssgame.com/f/m4KKGHi2rVUN/?query=<script>alert(1)</script>
访问,成功弹出弹框

所以该关卡XSS漏洞形成的原因是未对用户可控参数进行任何过滤。
2.参数过滤限制不严格,可通过符号进行隔断绕过
以下例子为XSS Game关卡3
这个关卡页面中有三个按钮,对应三张不同的图片,与图片同步的还有URL后面的数据

在URL中输入上文构造的XSS测试语句,发现script语句被写入到img语句中,没有被执行

查看源码:
var html = "Cat " + parseInt(name) + "<br>";
html += "<img src='/static/img/cat" + name + ".jpg' />";
document.getElementById('tabContent').innerHTML = html;
输入的数据与<img>
语句进行拼接,通过innerHTML语句写入到<div>
中,而innerHTML方法直接写入的<script>
语句不会被执行。故尝试使用符号进行语句截断,最后发现使用单引号可截断,于是构造拼接语句,得到如下URL:
http://www.xssgame.com/f/u0hrDTsXmyVJ/#1' onerror='alert(1)'
访问构造的URL,成功弹出弹框

单引号从1后面截断,src指向cat1文件,cat1文件不存在,加载错误,执行onerror事件里的alert()方法。所以该关卡虽然有做一些过滤与限制,但是过滤限制不严格,可通过截断绕过方式去进行XSS攻击。
3.跳转URL未做过滤限制
以下例子为XSS Game关卡4该页面依旧只有输入框与跳转键
通过查看源码得知输入框可忽略,只剩下"Next”键可利用
点击"Next"会跳转到下一个页面

查看代码获取到一个关键信息,以下代码中的welcome
类似于传入的参数,经传入其他参数测试,window.location
的值为可控参数,
<script>
setTimeout(function() { window.location = 'welcome'; }, 1000);
</script>
构造JavaScript语句并与URL进行拼接,得到如下URL:
http://www.xssgame.com/f/__58a1wgqGgI/confirm?next=javascript:alert(1)
访问,成功弹出弹框
所以该关卡是未对跳转URL进行过滤限制,导致攻击者可通过修改跳转URL进行XSS攻击。
4.对标签进行过滤不严格,可通过双写绕过过滤
以下例子为alert(1) to win JSON2
查看其源码得知参数过滤了</script
标签
function escape(s) {
s = JSON.stringify(s).replace(/<\/script/gi, '');
return '<script>console.log(' + s + ');</script>';
}
于是对</script>
标签进行嵌套双写,让其只过滤一次,得到如下结果:
</s</scriptcript>
// 中间的</script被过滤,只剩下前面的</s与cript>,前后进行拼接后,就得到了完整的</script>标签
所以对标签做黑名单过滤限制不严格时,攻击者可通过双写或大小写进行绕过,从而进行XSS攻击。
5.对符号转义不严格
以下例子为alert(1) to win Template
查看源码,可控参数s中的<>&"
被转义为HTML实体编码,其余的值通过innerHTML被拼接到<a>
标签中

由于以上符号被转义,但有一些符号未被转义,如\
,可使用其他类型的转义字符来代替被转义的字符。因为\
没有被转义,所以可使用\x3C
和\x3E
代替<>
,然后对语句进行拼接,得到如下结果:
对符号转义过滤不严格,可能会导致攻击者使用其他未限制的符号进行转义,形成XSS攻击。
四、XSS漏洞危害
XSS漏洞危害包含但不仅限于以下几种危害:
1.会话劫持,窃取用户或管理员的账号信息或Cookie,冒充用户或管理员进行登录系统或后台,进行一些恶意操作,对网站安全产生极大的威胁;
2.网站挂马,利用XSS漏洞进行传播,攻击者将恶意代码嵌入到Web程序中,当用户浏览挂马网页时,用户的计算机就会被植入木马;
3.利用XSS漏洞可网站重定向;
4.利用XSS漏洞构造URL脚本实现钓鱼攻击;
5.发送广告或垃圾信息,影响用户正常使用。
五、XSS漏洞防范
XSS的危害主要是取决于JavaScript能够实现的功能,XSS跨站脚本的形成原因是对输入输出没有严格过滤,导致在页面上可以执行JavaScript等客户端代码。以下列举一些XSS漏洞的防范方法:
1.反射型XSS和存储型XSS可以在服务器端对用户输入输出的内容过滤和编码操作,将关键字进行过滤处理,关键符号进行编码转义处理;
2.DOM型XSS如有在服务器端进行交互,也可参考上述的方法进行修复,如未和服务器端进行交互,可在客户端使用JavaScript等客户端脚本语言进行编码和过滤处理。
3.采用严格的CSP作一个辅助措施,可以降低XSS带来的风险与后果;
4.设置HTTP-only Cookie,禁止JavaScript读取某些敏感 Cookie,对Cookie劫持做限制,攻击者完成 XSS 注入后也无法窃取此 Cookie。
参考
Web安全头号大敌 XSS漏洞解决最佳实践
如何防止XSS攻击?
浅谈XSS漏洞攻击与防御
XSS Game通关经验
XSS练习平台【a/lert(1) to win】




