XSS 攻击详解,为什么建议 Cookie 加上 HttpOnly 属性?-LMLPHP

  • 如何进行 XSS 攻击?

    XSS 主要分为三种类型:存储型 XSS 攻击;反射型 XSS 攻击和基于 DOM 的 XSS 攻击。

    1.存储型 XSS 攻击

    存储型 XSS 攻击

    通过上图,我们可以看出存储型 XSS 攻击大致需要经过如下步骤:

    一个例子:

    以 2015 年喜马拉雅就被曝出的存储型 XSS 漏洞为例,看看整个 XSS 攻击流程。

    在用户设置专辑名称时,服务器对关键字过滤不严格,使得在编辑专辑名称的时候可以设置为一段 JavaScript,如下图所示:

    提交恶意脚本

    当 hacker 将专辑名称设置为一段 JavaScript 代码并提交时,喜马拉雅的服务器会保存该段 JavaScript 代码到数据库中。然后当用户打开 hacker 设置的专辑时,这段代码就会在用户的页面里执行(如下图)

    用户打开含有恶意代码的页面

    恶意脚本可以通过 XMLHttpRequest 或者 Fetch 将用户的 Cookie 数据上传到黑客的服务器。

    恶意服务器上的用户 Cookie

    再通过手动设置 Cookie 就可以绕过,直接登陆喜马拉雅。

    以上就是存储型 XSS 攻击的一个典型案例。这是乌云网在 2015 年曝出来的,虽然乌云网由于某些原因被关停了。默哀。

    2.反射型 XSS 攻击

    在一个反射型 XSS 攻击过程中,hacker 需要找到一个接口漏洞,用户给服务器发送的一些参数后,服务器没有经过处理,直接原封返回了部分参数,就给了黑客可乘之机,把恶意 JavaScript 脚本当参数发给服务器,服务器直接返回了这个脚本字符串,在浏览器 DOM 解析器中就顺利引入恶意脚本达成 hack。

    再举个例子现在我们有一个简单的服务

    var express = require('express');  
    var router = express.Router();  
    /* GET home page. */  
    router.get('/'function(req, res, next{  
     res.render('index', {  
       title'Express',  
        xss:req.query.xss   
      });  
    });  
    module.exports = router;  

    接受一个参数,并返回回去渲染成html。

    <!DOCTYPE html>  
    <html>  
    <head>  
      <title><%= title %></title>  
      <link rel='stylesheet' href='/stylesheets/style.css' />  
    </head>  
    <body>  
      <h1><%= title %></h1>  
      <p>Welcome to <%= title %></p>  
      <div>  
          <%- xss %>  
      </div>  
    </body>  
    </html>  

    访问:http://localhost:3000/?xss=123

    正常访问

    hacker 找到了这个漏洞,拼凑了一个这样的 url:http://localhost:3000/?xss=< script src="xxx">< /script>,然后诱骗你点击后,在页面上就会运行恶意脚本。

    值得注意的是,储存型 XSS 和反射性 XSS 有一个特别明显的区别就是反射型 XSS 是不会在服务器中存储脚本的,所有诱骗用户的方式也不同,hack 储存型 XSS的工作量主要在如果上传恶意脚本,剩下的就要等用户点击正常网页,反射型则需要诱骗用户主动点击包含漏洞 url。

    3.基于 DOM 的 XSS 攻击

    一般来说,hacker 是劫持不了正常的传输网络,但如果有内鬼能通过中间人代理劫持 html 传输,就可以修改 html 文件在其中任意穿插恶意脚本,再发送给用户。一般来说,这种情况出现于运营商中间,所以基于 DOM 的 XSS 我觉得应该称为基于内鬼的 XSS 攻击(狗头)。

    如何阻止 XSS 攻击

    总结

    XSS 攻击就是黑客往页面中注入恶意脚本,然后将页面的一些重要数据上传到恶意服务器。

    常见的三种 XSS 攻击模式是存储型 XSS 攻击、反射型 XSS 攻击和基于 DOM 的 XSS 攻击。

    这三种攻击方式的共同点是都需要往用户的页面中注入恶意脚本,然后再通过恶意脚本将用户数据上传到黑客的恶意服务器上。而三者的不同点在于注入的方式不一样,有通过服务器漏洞来进行注入的,还有在客户端直接注入的。

    针对这些 XSS 攻击,主要有三种防范策略,第一种是通过服务器对输入的内容进行过滤或者转码,第二种是充分利用好 CSP,第三种是使用 HttpOnly 来保护重要的 Cookie 信息。

    当然除了以上策略之外,我们还可以通过添加验证码防止脚本冒充用户提交危险操作。而对于一些不受信任的输入,还可以限制其输入长度,这样可以增大 XSS 攻击的难度。

    本文分享自微信公众号 - 江南一点雨(a_javaboy)。
    如有侵权,请联系 support@oschina.cn 删除。
    本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

    09-10 15:35