聊聊XSS攻击

什么是 XSS 攻击?

Cross Site Scripting(跨站脚本攻击)简称 XSS,攻击者通过在目标网站上注入恶意脚本(如:获取 Cookie、SessionID 等),使之在用户的浏览器上运行。为了和 CSS 区分,故称 XSS。

XSS 本质

恶意代码未经过滤,与网站正常的代码混在一起,浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。由于直接在用户的终端执行,恶意代码能够直接获取用户的信息,或者利用这些信息冒充用户向网站发请求(攻击者定义的)。
有输入限制的,可以通过引入外部的脚本,并由浏览器执行,来完成比较复杂的攻击策略。

注入方式

  • UGC(用户原创内容)

  • 来自第三方的链接

  • URL 参数

  • POST 参数

  • Referer (可能来自不可信的来源)

  • Cookie (可能来自其他子域注入)

XSS 分类

根据攻击来源分类:

存储型 XSS


步骤:
1.攻击者将恶意代码提交到目标网站的数据库中。
2.用户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。
3.用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
4.恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

这种攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。

反射型 XSS


步骤:
1.攻击者构造出特殊的 URL,其中包含恶意代码。
2.用户打开带有恶意代码的 URL 时,网站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器。
3.用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
4.恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

反射型 XSS 漏洞常见于通过 URL 传递参数的功能,如网站搜索、跳转等。
由于需要用户主动打开恶意的 URL 才能生效,攻击者往往会结合多种手段诱导用户点击。
POST 的内容也可以触发反射型 XSS,只不过其触发条件比较苛刻(需要构造表单提交页面,并引导用户点击),所以非常少见。

反射型 跟存储型 区别:
存储型 的恶意代码存在数据库里,反射型 的恶意代码存在 URL 里。

DOM 型 XSS


步骤:
1.攻击者构造出特殊的 URL,其中包含恶意代码。
2.用户打开带有恶意代码的 URL。
3.用户浏览器接收到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行。
4.恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

跟前两种 XSS 的区别:
DOM 型 取出和执行恶意代码由浏览器端完成,属于前端 Js 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞。

XSS 攻击预防

通过前面介绍,我们了解到 XSS 攻击的对象是客户端,攻击要素:
1.攻击者提交恶意代码。
2.浏览器执行恶意代码。

我们接下来一一展开。

防止攻击者提交恶意代码

我们可以进行输入过滤,将用户提交的内容进行过滤。问题来了,前端做还是后端做呢?
1.前端过滤
攻击者可以构造请求,直接绕过前端将恶意代码提交。
2.后端过滤
前端接收到的是转义后的内容,在有些位置需要进行转义,否则可能显示是乱码,但是你转义后,是不是意味着这个代码依旧不变(依然会攻击)。因此输入过滤它只能解决部分 XSS 问题。
不过对于明确的输入类型,例如:数字、URL、电话号码、邮件地址等等内容,进行输入过滤还是必要的。
既然防止攻击者提交恶意代码并不完全可靠,我们就试试另一种。

防止浏览器执行恶意代码

我们应该从这两方面进行思考:
1.防止 HTML 中出现注入。
2.防止 JavaScript 执行时,执行恶意代码。

分析一

存储型和反射型 XSS 都是在服务端取出恶意代码后,插入到响应 HTML 里然后被浏览器所执行。预防这两种漏洞,有两种常见做法:

1.改成纯前端渲染,把代码和数据分隔开
  其实就是浏览器先渲染静态 HTML,然后页面所需数据直接让 Js 通过 Ajax 获取数据。但是仍然需要预防 DOM 型 XSS(文章后会提到)

2.对 HTML 做充分转义
  对于性能要求高,或有 SEO 需求的页面,我们仍然要面对拼接 HTML 的问题。那么采用合适的转义库,对 HTML 模板各处插入点进行充分的转义,同时在不同的上下文里要使用相应的转义规则。

分析二


不同的上下文,如 HTML 属性、HTML 文字内容、HTML 注释、跳转链接、内联 JavaScript 字符串、内联 CSS 样式表等,所需要的转义规则不一致。

其他 XSS 预防

总结

关于网络安全的问题,其实我们在做金融 app 解决方案的过程中,同样会提供一套关于安全的解决方案,例如:

  • EMM(Enterprise Mobility Management)能够帮助企业将移动设备与安全框架、系统以及IT生命周期管理进行集成。企业可以使用EMM进行配置、审计,保护企业数据安全和用户支持。
  • VPN 在公用网络上建立专用网络,进行加密通讯。
  • HTTPS 协议。

不过虽然有了一套成熟的解决方案,但是对于一个研发人员,网络安全的基本知识还是需要了解的。

参考文章

Web安全-XSS
如何防止XSS攻击?