XSS跨站脚本攻击

Posted by wang chong on March 21, 2019

什么是XSS

XSS是跨站脚本攻击,是发生在目标用户浏览器层面上的。当渲染DOM树的过程中发生了再预期内执行的JavaScript代码时,就发生了XSS攻击

XSS的攻击方式

XSS的攻击方式有三种:

  1. 反射型XSS
  2. 存储型XSS
  3. DOM XSS

反射型XSS

反射型XSS也叫非持久型XSS,是指发生请求时,XSS代码出现在请求URL中,作为参数提交给服务器,服务器解析并响应,响应结果中包含XSS代码,最后浏览器解析并执行。

总结来说就是:XSS代码首先出现在URL中,然后需要服务端解析并响应给客户端,最后需要浏览器解析之后代码才能执行。

这种方式常用于获取用户的Cookie,通过对使用未写入srcimg标签设定onerror = ()=>alert(document.cookie)获取到用户的cookie信息。

<img src="null" onerror= ()=> alert(document.cookie) />

存储型XSS

存储型XSS,也叫做持久型XSS,主要是将XSS代码发送到服务端(无论是数据库、内存还是文件系统),然后下次请求页面的时候,XSS代码会随着浏览器渲染出来,就不需要手动再次带上XSS代码。

这个典型的例子就是留言板,用户提交一条包含XSS代码的留言到数据库,当目标用户查看留言的时候就会从服务器解析之后加载出来,浏览器发现有可执行的代码,就当做正常的HTML和CSS或者JS进行解析,XSS攻击就产生了。

DOM XSS

DOM XSS 不同于反射型和存储型,DOM XSS不需要服务端解析之后相应的直接参与,而是通过客户端的DOM解析,完全是客户端的事情。

简单的说:DOM XSS是我们开发者自己所造成的。在JavaScript中有个eval方法,它的作用就是把一串字符串可以当做真正的JavaScript代码来执行。这样就有可能会对我们的代码造成攻击。

XSS的危害

  1. 通过document.cookie可以盗取用户的cookie。如果是黑客的话,可能还会做一些其他的手段。
  2. 使用JavaScript或者CSS破话页面正常的结构和样式。黑客可以通过在用户端获取到的用户信息发送到黑客的服务器上。
  3. 流量劫持(通过询问某段具有window.location.href定位到其他页面,进行流量劫持)。
  4. Dos攻击:利用合理的客户端请求来占用过多的服务端资源,从而使合法用户无法得到服务端响应。
  5. 利用iframeframeXMLHttpRequestFlash方式,以被攻击用户的身份执行一些管理动作,或执行一些如:发微博、加好友、发私信等操作。
  6. 利用可被攻击的域收到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不正当的投票活动等等。

XSS防御

从上面三种XSS类型可以看出,我们不能讲用户提交的数据原样的存到服务器,需要对用户的输入的数据进行一些处理。

问题如下:

  1. 没有过滤危险的DOM元素。

    如:执行脚本能script,具有现实广告及色情图片的img,具有改变样式的linkstyle,具有内嵌页面的iframeframe等元素节点。

  2. 没有过滤的属性节点。如:eventstylesrchref等等。
  3. 没有对Cookie设置httpOnly

解决办法

对Cookie的保护

通过在服务端设置httpOnly,不让客户端使用document.cookie来读取cookie

设置方式

response.setHeader("Set-Cookie","cookiename=value;path=/;Domain=domainvalue;Max-Age=second;HTTPONly");

对用户输入数据的处理

  1. 编码:对用户输入的数据进行实体编码。
  2. 解码:原样显示内容的时候必须解码
  3. 过滤:对一些敏感的DOM元素进行过滤掉,从而保护安全性。