XSS

Posted by Eric Jin on 2019-06-25

什么是XSS攻击

“XSS是跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。”

分类

三类: 反射型 XSS(非持久型)、存储型 XSS(持久型)和DOM XSS

反射型 XSS

发出请求时,XSS代码出现在URL中,作为输入提交到服务器端,服务器端解析后响应,XSS代码随响应内容一起传回给浏览器,最后浏览器解析执行XSS代码。这个过程像一次反射,故叫反射型XSS

在一个<input /> 标签里面,我们输入下面的串,然后通过ajax把这个当做参数发往服务器,服务器解析以后json返回,然后前端把数据解析显示在页面上。

这种攻击的数据流就是:前端–>后端–>前端

<script>alert(document.cookie)</script>

cookie-demo demo
这里,我只是模拟攻击,所以通过alert来获取个人的cookie。但是如果是邪恶的攻击,由于我们在网页浏览的时候常常涉及到用户的登录,登录完以后服务端就会返回一个cookie,这个就相当于一个令牌,拿着这个就等于证明了你是某个用户。如果你的cookie被窃取,那么攻击者很可能拿着你的这张令牌就可以直接登录你的账户。

对于这种方式的cookie 盗取,我们可以在服务端Set-Cookie的时候使用HttpOnly来消除。

String sessionid = request.getSession().getId();
// be careful overwriting: JSESSIONID may have been set with other flags
response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; HttpOnly");

存储型 XSS

将XSS代码发送到服务器(不管是数据库、内存还是文件系统等),然后在下次请求页面的时候就不用带上XSS代码了

典型的就是BBS。用户在留言内容中提交一个

<script>alert(hey!you are attacked)</script>

所有用户进入BBS的时候,这条留言就被加载处理,被前端处理。

这种攻击的数据流就是:前端–>后端–>数据库–>后端–>前端

DOM XSS

不同于反射型XSS和存储型XSS,DOM XSS代码不需要服务器端的解析响应的直接参与,而是通过浏览器端的DOM解析。这完全是客户端的事情。

DOS XSS 的代码攻击可能在于我们编写的JS代码造成的。

localhost/test.html

<script>
eval('alert(location.hash.slice("1"))');
</script>

如果访问localhost/test.html#document.cookie,那么在没有服务端参与的情况下,就会触发XSS攻击,获取到你的cookie。

因此预防DOM XSS 的话,需要在前端对数据进行escape转义,少用eval来解析站外数据。

这种攻击的数据流就是:前端–>浏览器

XSS的攻击过程

反射型XSS漏洞:

  1. Alice经常浏览某个网站,此网站为Bob所拥有。Bob的站点需要Alice使用用户名/密码进行登录,并存储了Alice敏感信息(比如银行帐户信息)。
  2. Tom 发现 Bob的站点存在反射性的XSS漏洞
  3. Tom 利用Bob网站的反射型XSS漏洞编写了一个exp,做成链接的形式,并利用各种手段诱使Alice点击
  4. Alice在登录到Bob的站点后,浏览了 Tom 提供的恶意链接
  5. 嵌入到恶意链接中的恶意脚本在Alice的浏览器中执行。此脚本盗窃敏感信息(cookie、帐号信息等信息)。然后在Alice完全不知情的情况下将这些信息发送给 Tom。
  6. Tom 利用获取到的cookie就可以以Alice的身份登录Bob的站点,如果脚本的功更强大的话,Tom 还可以对Alice的浏览器做控制并进一步利用漏洞控制

存储型XSS漏洞:

  1. Bob拥有一个Web站点,该站点允许用户发布信息/浏览已发布的信息。
  2. Tom检测到Bob的站点存在存储型的XSS漏洞。
  3. Tom在Bob的网站上发布一个带有恶意脚本的热点信息,该热点信息存储在了Bob的服务器的数据库中,然后吸引其它用户来阅读该热点信息。
  4. Bob或者是任何的其他人如Alice浏览该信息之后,Tom的恶意脚本就会执行。
  5. Tom的恶意脚本执行后,Tom就可以对浏览器该页面的用户发动一起XSS攻击

XSS的危害

归根结底,XSS的攻击就是想方设法让用户的浏览器去执行原始网站原本不存在的前端代码。

虽然刚刚示范的信息弹窗不友好,但是真正的黑客在恶意攻击是是不会仅仅alert 的。

  1. 窃取网页浏览中的cookie(上述展示)
  2. 破坏页面正常的结果与样式
  3. 劫持流量实现恶意跳转

这个其实就是想办法在网页中插入这样一句话

<script>window.location.href="http://www.baidu.com";</script>

2011年新浪微博就爆发过严重的XSS漏洞,导致大量用户自动关注某个微博号并自动转发某条微博。可以在这里看:新浪微博XSS漏洞攻击过程详解

从以上可知,存储型的XSS危害最大,因为它存在服务端,不需要和被攻击者接触,只要被攻击者访问了页面就会遭受攻击。而反射型和DOM型需要诱使用户去点击构造的恶意URL,需要和用户有直接或间接的接触,比如社会工程学或者一些不安全网站的诱惑链接。

防范手段

当我们知道了XSS的攻击原理以后,防守也就是针对性的,显而易见的。

总体思路就是:对用户输入(和URL参数)进行过滤,对输出进行html编码

  • 过滤。首先对<script><img><a>等标签进行过滤

  • 编码。对一些常见的符号 <> 在输入的时候要进行编码,这样浏览器就不会对标签进行解释执行了

  • 服务端对cookie 设置HttpOnly

扩展阅读: