朝花夕拾——XSS攻击

410 阅读5分钟

互联网上关于XSS攻击的相关介绍与应对措施已经被说烂了,但是我自己从来都是看一遍忘一遍,这里我试试用自己的理解再次温习一遍XSS攻击的相关知识,也方便下次复习~

浏览器的同源策略像是一座天平,资源的自由与用户的安全是这座天平的两端,如何平衡两者的关系成为了每个开发者必须面对的课题。严格遵守同源策略可以保证安全,同时也带来了获取资源操作上的繁琐。应用CORS技术获得资源获取的灵活性的同时,又同样带来了安全漏洞:XSS攻击就是典型。

XSS 是定义什么

XSS全称:Cross Site Scripting,意思是跨站脚本。顾名思义实施攻击的方式就是通过恶意脚本进行。攻击者在用户浏览的网页中植入一段恶意代码,这段代码在加载时自动执行,对用户进行攻击行为。浏览器对于HTML或DOM中的script段都是一视同仁,所以没法分辨哪段代码是正常需要的,哪段代码是恶意脚本。

最开始的时候XSS是通过跨域实现的,如今"跨站注入"已经不是唯一的方式,但因为本质相同所以沿用了XSS这一称呼。

XSS 发动攻击的目的是什么

XSS能做的事情有以下几个:

  1. 获取用户的cookie:

    恶意代码可以直接使用document.cookie获取浏览当前页面的用户的Cookie,然后通过XMLHttpRequest或Fetch等方式,将信息发送给攻击者。之后攻击者就可以在他自己那一端伪装成用户,进行私密性操作。

  2. 监听用户行为:

    攻击者可以注册全局addEventListener来监听用户行为,用户的操作将一丝不差的反馈到攻击者那一端。

  3. 修改DOM:

    恶意代码可以生成DOM,如果恰好是登录页面被注入,恶意脚本的操作使用假的登录界面是覆盖原本的,这样一来用户的账号密码将通过虚假的DOM直接提交给攻击者。

  4. 修改DOM的延伸:

    替换DOM也可以把浏览的网页整个换掉,换成广告页面等。

总之,XSS就是攻击者为了肆意操作网页而发动的攻击。

XSS 发动攻击的方式有哪些

存储型XSS

存储型XSS是直接把恶意代码存储到数据库里面,用户请求网页时拿到的就是含有恶意代码的页面。在页面加载阶段,就会顺带着执行了这部分恶意代码,可谓是防不胜防。

反射型XSS

反射型XSS是将恶意代码放在请求里面,后端不用这部分信息并且还会原样返回到页面。

页面的处理过程如果是把恶意代码直接使用innerHTML插入DOM,那么就触发了反射性XSS攻击。

看看示例:

<!DOCTYPE html>
<html>
<head>
  <title>反射型XSS</title>
  <link rel='stylesheet' href='/stylesheets/style.css' />
</head>
<body>
  <h1>xss</h1>
  <div>
      {{ xss }}
  </div>
</body>
</html>
<!-- 后端部分是接受get请求,将请求的数据原样返回 -->

发送请求http://localhost:8888/?xss=123,这时候页面正常展示<h1>xss</h1><div>123</div>

我们来搞点事,发送请求http://localhost:8888/?xss=<script>alert('受到攻击!')</script>,这时候惊人的事情发生了:页面会alert一个内容为'受到攻击!'的弹窗。

我在工作中首次遇到的XSS攻击就是反射型攻击,我处理的方法是在发送请求时用正则过滤危险字段,详情移步

基于DOM的XSS

这种形式的XSS攻击,攻击者会在数据传输阶段进行劫持,把恶意代码注入到html中。劫持的方式有很多,比如WiFi劫持,恶意插件劫持等等。

XSS 如何防范

XSS的本质就是一段恶意脚本,因此XSS的防范也是针对恶意脚本,开发者只要在可能的地方过滤恶意脚本就可以防范绝大多数XSS攻击。

脚本过滤

脚本过滤是把恶意代码过滤掉,例如反射型XSS中的链接,我当是采取的方式是出现可疑脚本的请求全部禁止发送。

还有一种方案是将恶意代码转码,还是拿反射型XSS中的例子来说明

?xss=<script>alert('受到攻击!')</script> // 经过转码后变成下面
?xss=&lt;script&gt;alert(&#39;你被xss攻击了&#39;)&lt;/script&gt;

CSP

这种预防措施需要从定义出发,当你知道了CSP是什么,具有什么功能的时候,自然就会明白为什么CSP也能够防范XSS攻击。

首先来说一下CSP是什么。CSP 是让服务器决定浏览器能够加载哪些资源,让服务器决定浏览器是否能够执行内联 JavaScript 代码。

CSP的功能:

  1. 限制加载其他域下的JavaScript等资源文件
  2. 禁止向其他域提交数据
  3. 禁止执行内联脚本和未授权脚本
  4. 提供上报机制

利用HttpOnly属性

HttpOnly属性是浏览器提供用于保护用户Cookie的。返回Cookie数据的响应头(response header)中如果设置了HttpOnly,那么该段Cookie将无法被document.cookie读取,只能在发送请求时自动追加到请求头(request header)中

因为大部分XSS攻击都是以获取用户Cookie来伪装用户身份为目的,因此这种方式也能在一定程度上防范XSS攻击。

以上内容为阅读众多XSS博客后的个人理解,如有错误欢迎指正~