前端安全


你不得不知道的前端安全


 

那些年学过的信息安全

  最近常常看到这样几个词,前端安全、XSS、请求劫持…。不得不说有点晃眼,作为一个本科学了4年信息安全的学生,如今走上了前端这条路后,已经很久很久没有再去关注过安全这方面。
  在刚刚接触安全这一块时,其实还是很感兴趣的,曾经也希望自己可以成为一名黑客,可怎奈岁月是把杀猪刀,黑了木耳,紫了葡萄,硬了香蕉!
  那时,无论是DES、RSA,甚至ECC,都是耳熟能详的加密方式,还有周林老师讲的什么洋葱路由、MIME等,可惜自己用力不勤。现如今都只是属于“听说过”,难免心有遗憾。
  我是要成为海贼王的男人!没错,不会前端安全的海贼不是一个好的FE。
  接下来,打算就从前端领域的安全问题入手。左手前端,右手安全,手感肯定不错!

重拾web安全

  接下来就进入正题啦!我们先从做web前端安全机制问题全解析!
  首先,我们来看下前端方面比较常见的几种攻击!
  Web安全比较经典的攻击手段有三种:xss,csrf,界面操作劫持。

XSS攻击

  XSS全称(Cross Site Scripting) 跨站脚本攻击,为了避免和CSS重名,所以改成了XSS。它是Web程序中最常见的漏洞。
  其攻击方式主要是攻击者在网页中嵌入客户端脚本(例如JavaScript), 当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的. 比如获取用户的Cookie,导航到恶意网站,携带木马等。
  由于它的攻击方式比较多,又分成3个小类别,各自是反射型XSS、存储型XSS和DOM XSS。

反射型XSS

  反射型XSS,又称非持久型XSS。之所以称为反射型XSS,则是因为这种攻击方式的注入代码是从目标服务器通过错误信息、搜索结果等等方式“反射”回来 的。而称为非持久型XSS,则是因为这种攻击方式具有一次性。攻击者通过电子邮件等方式将包含注入脚本的恶意链接发送给受害者,当受害者点击该链接时,注入脚本被传输到目标服务器上,然后服务器将注入脚本“反射”到受害者的浏览器上,从而在该浏览器上执行了这段脚本。
  反射性XSS危害虽然相对较小,但是应该是XSS中使用最多的一种手段。举个例子:
  

1
  http://www.test.com/xss/reflect.php?x=<script>alert(1)</script>

  如果后台对x的值没有经过任何过滤,那么当用户打开这个URL时,攻击者就诱导用户去点击,用户点击后就会触发script里的脚本了,alert只是一个示例,将里面的代码改成比如把用户cookie发送到你自己的服务器,那就顺利获得被攻击用户在该站点的cookie,然后一般就可以顺利登入,做各种羞羞的事!

存储型XSS

  存储型XSS会把用户输入的数据“存储”在服务器端。这种XSS具有很强的稳定性,危害性也要大的多。存储型XSS也叫持久型XSS。
  最典型的例子是留言板XSS,用户提交一条包含XSS代码的留言存储到数据库,目标用户查看留言板时,那些留言的内容会从数据库查询出来并显示,浏览器发现有XSS代码,就当做正常的HTML与JS解析执行,于是就触发了XSS攻击。

DOM XSS

  DOM XSS和前两者的区别在于,DOM XSS的XSS代码并不需要服务器解析响应的直接参与,触发XSS靠的就是浏览器端的DOM解析,可以认为完全是客户端的事情。这类XSS作为一个前端的同学应该是要尤其注意。举个例子,当用户访问http://www.test.com/xssme.html#alert(1)时,如果页面脚本中有下面这样的代码:
  

1
2
3
  <script>
    eval( location.hash.substr(1) );
  </script>

  整个过程跟服务端完全没有任何关系,攻击者就可以轻松诱导别人点击有XSS代码的URL实现攻击。

CSRF攻击

  关于这种攻击,有篇写的很不错的文章:浅谈CSRF攻击方式
  我下面也是对其的复述!
  CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding。
  你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账……造成的问题包括:个人隐私泄露以及财产安全。
  CSRF这种攻击方式在2000年已经被国外的安全人员提出,但在国内,直到06年才开始被关注,08年,国内外的多个大型社区和交互网站分别爆出CSRF漏洞,如:NYTimes.com(纽约时报)、Metafilter(一个大型的BLOG网站),YouTube和百度HI……而现在,互联网上的许多站点仍对此毫无防备,以至于安全业界称CSRF为“沉睡的巨人”。
  下图简单阐述了CSRF攻击的思想:
  
  从上图可以看出,要完成一次CSRF攻击,受害者必须依次完成两个步骤:
  1. 登录受信任网站A,并在本地生成Cookie。
  2. 在不登出A的情况下,访问危险网站B。
  看到这里,你也许会说:“如果我不满足以上两个条件中的一个,我就不会受到CSRF的攻击”。是的,确实如此,但你不能保证以下情况不会发生:
  1.你不能保证你登录了一个网站后,不再打开一个tab页面并访问另外的网站。
  2.你不能保证你关闭浏览器了后,你本地的Cookie立刻过期,你上次的会话已经结束。(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了)。
  3.上图中所谓的攻击网站,可能是一个存在其他漏洞的可信任的经常被人访问的网站。

请求劫持

  请求劫持现在主要分为两种,DNS劫持与HTTP劫持。

DNS劫持

  DNS劫持就是通过劫持了DNS服务器,通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致对该域名的访问由原IP地址转入到修改后的指定IP,其结果就是对特定的网址不能访问或访问的是假网址,从而实现窃取资料或者破坏原有正常服务的目的。DNS劫持通过篡改DNS服务器上的数据返回给用户一个错误的查询结果来实现的。   
  DNS劫持症状:在某些地区的用户在成功连接宽带后,首次打开任何页面都指向ISP提供的“电信互联星空”、“网通黄页广告”等内容页面。还有就是曾经出现过用户访问Google域名的时候出现了百度的网站。这些都属于DNS劫持。 再说简单点,当你输入google.com这个网址的时候,你看到的网站却是百度的首页。

HTTP劫持

  在用户的客户端与其要访问的服务器经过网络协议协调后,二者之间建立了一条专用的数据通道,用户端程序在系统中开放指定网络端口用于接收数据报文,服务器端将全部数据按指定网络协议规则进行分解打包,形成连续数据报文。   
  用户端接收到全部报文后,按照协议标准来解包组合获得完整的网络数据。其中传输过程中的每一个数据包都有特定的标签,表示其来源、携带的数据属性以及要到何处,所有的数据包经过网络路径中ISP的路由器传输接力后,最终到达目的地,也就是客户端。   
  HTTP劫持是在使用者与其目的网络服务所建立的专用数据通道中,监视特定数据信息,提示当满足设定的条件时,就会在正常的数据流中插入精心设计的网络数据报文,目的是让用户端程序解释“错误”的数据,并以弹出新窗口的形式在使用者界面展示宣传性广告或者直接显示某网站的内容。

HTTPS机制

  HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。很多的攻击都可以使用Https来搞定,比如上面说的Http劫持。
  具体是如何进行加密,解密,验证的,且看下图。
  
  Https的原理其实就是非对称加密,这点不清楚的可以去百度下。
  其工作流程主要为分下面5步,
  1. 客户端发送https请求,告诉服务器发将建立https连接;
  2. 服务器将服务端生成的公钥返回给客户端,如果是第一次请求将告诉客户端需要验证链接;
  3. 客户端接收到请求,通过获取到的服务器公钥,然后加密客户端生成的公钥(一般是一个随机数)和一段随机数加密的报文,发送给服务器;
  4. 服务器获取到加密的报文和客户端公钥(随机数),先使用服务器私钥解密出该随机数和报文,然后将报文通过客户端的公钥(随机数)加密返回给客户端;
  5. 客户端通过随机数解密报文,判断是否为自己开始发送的报文串;如果正确,说明安全连接验证成功,将数据通过服务器公钥加密不断发送给服务器,服务器也不断解密获取报文,并通过客户端公钥加密返回给客户端验证。这样就建立了不断通信的连接;
  这里涉及一个关键点,就是对于客户端和服务器端的验证一般采用RSA算法,而真正通信时就是用客户端生成的随机数。这是因为RSA加密涉及复杂的数学计算,性能消耗大。而采用随机数加密就是传统的对称加密,效率高。

参考文章

  1. web前端安全机制问题全解析
  2. 浅谈WEB安全性(前端向)
  3. 图解 HTTPS 通信过程
  4. 从零开始学web安全(1)
  5. 从零开始学web安全(2)
  6. 从零开始学web安全(3)
  7. 浅谈CSRF攻击方式   

MaybeXia wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
坚持原创分享,您的支持将鼓励我继续创作!