zoukankan      html  css  js  c++  java
  • XSS

    问题:

      有很多用户发送了同样类型的内容,而且这些内容都是一个带有诱惑性的问题和一个可以点击的链接。这些用户全部反馈说,这不是他们自己发的。前端开发表示,用户内容都是后端产生的,他不负责。后端开发表示,这些内容都是用户自己提交上来的,他也不负责

     

    XSS 攻击是如何产生的?

      作为最普遍的网页语言,HTML 非常灵活,你可以在任意时候对 HTML 进行修改。但是,这种灵活性也给了黑客可趁之机:通过给定异常的输入,黑客可以在你的浏览器中,插入一段恶意的 JavaScript 脚本,从而窃取你的隐私信息或者仿冒你进行操作。这就是 XSS 攻击(Cross-Site Scripting,跨站脚本攻击)的原理。

    XSS 攻击类型:

    1. 反射型 XSS

    假设现在有一个搜索网页,当你输入任意一个关键词,并点击“搜索”按钮之后,这个网页就会给你展示“你搜索的结果内容是:XXX”。

    我们以 PHP 为例,这个网页的服务端实现逻辑如下所示:

    <!DOCTYPE html>
    <html>
      <body>
        <form role="search" action="" method="GET">
          <input type="text" name="search" placeholder="请输入要搜索的内容">
              <button type="submit">搜索</button>
          </form>
        <?php
          if (isset($_GET['search']) && !empty($_GET['search'])) {
            $search = $_GET['search'];
            echo "<h3>你搜索的结果内容是:" . $search . "</h3>";
          }
        ?>
      </body>
    </html>

    我们可以看到,这段代码的逻辑是将搜索框输入的内容,拼接成字符串,然后填充到最终的 HTML 中。而且这个过程中没有任何的过滤措施,如果黑客想要对这个过程发起攻击,他会输入下面这行代码:

    </h3><script>alert('xss');</script><h3>

    黑客输入这段字符后,网页会弹出一个告警框(我自己测试的时候,发现部分浏览器,如 Safari 不会弹出告警框,这是因为浏览器自身提供了一定的 XSS 保护功能)。

    通过查看网页的源码,可以发现,这中间多了一段 JavaScript 的脚本:

    这就是我们所说的反射型 XSS 攻击的过程。其实它攻击的原理很简单。我们可以总结一下,即通过开头的</h3>和结尾的<h3>,将原本的<h3>标签进行闭合,然后中间通过<script>标签插入 JavaScript 代码并执行,就完成了整个反射型 XSS 的流程。

    你可以注意一下浏览器的地址:http://localhost/index.php?search=<%2Fh3><script>alert('xss')%3B<%2Fscript><h3> 。实际上,任何人只要点击了这个链接,就会执行一段黑客定义的 JavaScript 脚本。所以,我们经常说,不要点击任何未知的链接

    反射型 XSS 的总体流程我总结了一下,你可以看下面这张图。黑客诱导你点击了某个链接,这个链接提供的服务,可能就是上述的搜索功能。网页在解析到链接的参数后,执行正常的搜索逻辑,但是因为漏洞,网页中被填入了黑客定义的脚本。使得用户的浏览器,最终执行的是黑客的脚本

     2. 基于 DOM 的 XSS

    在上面的例子中我们可以看到,反射型 XSS 产生在前后端一体的网页应用中,服务端逻辑会改变最终的网页代码。但是,目前更流行的其实是前后端分离,这样网页的代码不会受服务端影响。那么,这样是不是就安全了呢?显然不是的。尽管服务端无法改变网页代码,但网页本身的 JavaScript 仍然可以改变。而黑客只要利用了这一点,同样能够在网页中插入自己的脚本。这也就是所谓的基于 DOM 的 XSS 漏洞。

    对于上述搜索功能,通过前后端分离,它的源码就变成了下面这样:

    <!DOCTYPE html>
    <html>
      <body>
        <form role="search" action="" method="GET">
          <input type="text" name="search" placeholder="请输入要搜索的内容">
              <button type="submit">搜索</button>
          </form>
          <script>
            var search = location.search.substring(8);
            document.write('你搜索的结果内容是:' + decodeURIComponent(search));
          </script>
      </body>
    </html>

    那么和上述例子一样,在基于 DOM 的 XSS 中,黑客也可以通过插入一段<script>alert('xss');</script>来执行指定的 JavaScript 脚本。基于 DOM 的 XSS 总体流程如下图所示。可以看到,这个流程其实和反射型 XSS 一致,只是不需要经过服务端了而已

     3. 持久型 XSS

    你可以回想一下,当你在网页中搜索一个关键词时,实际上与这个关键词相关的所有搜索结果都会被展示出来。一旦这些搜索结果中,包含黑客提供的某个恶意 JavaScript 脚本,那么只要我们浏览了这个网页,就有可能会执行这些脚本。这就是持久型 XSS。因为这些恶意的搜索结果,会长期保存在服务端数据库中,所以它又叫作存储型 XSS。在应用中,存储用户的输入并对它们进行展示的地方,都可能出现持久型 XSS。比如:搜索结果、评论、博文等等。

     相比前面两种 XSS 攻击来说,持久型 XSS 往往具备更强的危害性。因为对于一个反射型或者基于 DOM 的 XSS 来说,需要黑客诱导用户点击恶意的 URL,才能够成功地在用户浏览器上执行 JavaScript 脚本。这对黑客在诱导用户操作方面的能力提出了考验:并不是所有的用户都是小白,一些有经验的用户会在点击链接前进行一定的考虑。

    通过 XSS 攻击,黑客能做什么?

    1. 窃取 Cookie

    因为黑客注入的 JavaScript 代码是运行在 server.com 这个域名下的,因此,黑客可以在 JavaScript 中通过 document.cookie 获得 Cookie 信息。

    2. 未授权操作

    我们提到的微博 XSS 攻击事件中,黑客就利用 JavaScript 脚本,让用户发送了一个微博,微博中同时还带有反射型 XSS 的链接。这样一来,每个点击链接的用户都会通过微博的形式,诱导更多的用户点击链接,一传十、十传百,造成大范围的传播

    3. 按键记录和钓鱼

    avaScript 的功能十分强大,它还能够记录用户在浏览器中的大部分操作。比如:鼠标的轨迹、键盘输入的信息等。也就是说,你输入的账号名和密码,都可以被 JavaScript 记录下来,从而被黑客获取到

    外,即使某个存在 XSS 漏洞的页面不具备任何输入框,黑客还可以通过修改 DOM,伪造一个登录框,来诱导用户在本不需要登录的页面,去输入自己的用户名和密码。这也是“钓鱼”的一种形式,在这个过程中用户访问的域名是完全正常的,只是页面被篡改了,所以具备更高的迷惑性。

    如何进行 XSS 防护?

    1. 验证输入 OR 验证输出

    防护的核心原则是:一切用户输入皆不可信。

    常见的 XSS 注入:

     2. 编码

    XSS 防护的核心原则就是验证,优先采用编码的方式来完成。所谓编码,就是将部分浏览器识别的关键词进行转换(比如 < 和 >),从而避免浏览器产生误解

    3. 检测和过滤

    4.CSP

    所谓 CSP,就是在服务端返回的 HTTP header 里面添加一个 Content-Security-Policy 选项,然后定义资源的白名单域名。浏览器就会识别这个字段,并限制对非白名单资源的访问。

    参考资料:

    《安全攻防技能》专栏

    https://www.cnblogs.com/tugenhua0707/p/10909284.html#_labe5

    有很多用户发送了同样类型的内容,而且这些内容都是一个带有诱惑性的问题和一个可以点击的链接。这些用户全部反馈说,这不是他们自己发的。前端开发表示,用户内容都是后端产生的,他不负责。后端开发表示,这些内容都是用户自己提交上来的,他也不负责
  • 相关阅读:
    vi/vim系统编辑命令使用技巧
    C++基础之智能指针
    C++基础之volatile关键字
    C++基础之强制类型转换
    C++基础之左值、右值与移动语义
    C++基础之对象模型
    C++基础之运行时类型识别RTTI
    C++基础之指针与引用的底层实现
    深度学习之参数计算(CNN为例)
    数学基础之勾股数
  • 原文地址:https://www.cnblogs.com/mysky007/p/12489460.html
Copyright © 2011-2022 走看看