65.9K
CodeProject 正在变化。 阅读更多。
Home

跨站脚本攻击 (XSS)

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2024年5月6日

CPOL

3分钟阅读

viewsIcon

2261

本文讨论了跨站脚本攻击 (XSS),并重点关注了存储型和非存储型 XSS 攻击。

大家好!

继续我们对各种安全漏洞的介绍,今天我想回顾一下跨站脚本攻击,通常简称为 XSS。 虽然从技术上讲,可能存在几种不同的 XSS 类型,但我将重点关注两种:存储型和非存储型。

存储型 XSS

考虑一个社交网络应用程序,用户可以在其中发帖,并且该帖子将出现在其所有联系人的时间线上。 显示帖子的后端逻辑可能如下所示:

    $posts = get_posts_for_user($user_id);

    foreach ($posts as $post) {
?>
    <div class="post">
        <p class="post-username"><?php echo $post->username; ?></p>
        <p class="post-body"><?php echo $post->body; ?></p>
    </div>
<?php
    }

这有点人为设计,但希望你能理解。 服务器端代码检索已登录用户的所有相关帖子,循环遍历它们并将它们逐个列出。

现在考虑一下,如果用户的某个联系人提交了以下内容的帖子会发生什么:

Feeling hacky today!

<script>
    //
</script>

每当此帖子被另一个用户的浏览器渲染时,脚本标签将被执行。 为了简洁起见,我将其留空,但它可能执行的几个示例是:

  • 将恶意文件下载到用户的计算机
  • 更改其他帖子的本地显示内容,或者更改特定人员发布的帖子
  • 破坏社交媒体网站
  • 播放一些用户无法关闭的隐藏媒体

因为帖子已保存(又名存储)到社交网络应用程序的数据库中,所以我将其归类为存储型 XSS 攻击。

非存储型 XSS

考虑一个允许用户搜索产品的在线商店。 搜索词存储在查询字符串中,因此示例 URL 可能如下所示:https://www.onlinestore.com/search?q=Cool+products

搜索页面的服务器端代码可能如下所示:

<h3>Search results for <?php echo $_GET['q']; ?></h3>
$results = do_search$($_GET['q']);

foreach ($results as $result) {
    // ...
}

鉴于此,想象一下攻击者向目标用户发送包含以下链接的电子邮件或其他消息:

<a href="https://www.onlinestore.com/search?q=<script></script>">Products on sale</a>

再次,为了简洁起见,我将脚本标签留空,但我们可以想象攻击者可能尝试的各种事情,例如:

  • 更改页面的 HTML 以包含或修改产品列表
  • 更改产品的链接以指向钓鱼网站
  • 通常破坏在线商店

因为恶意内容来自查询字符串而不是数据库记录,因此未被“存储”,我将其归类为非存储型。

XSS 中“跨站”到底是什么意思?

通过这两个示例,你实际上可能有点像 Obi Wan 一样,想知道“跨站脚本”的名称从何而来,因为该漏洞似乎没有任何固有的“跨站”的东西。 根据 Wikipedia 的说法,XSS 之所以得名,是因为在利用的早期,它通常是由一个网站调用另一个网站来完成的。 但这是一个有点用词不当,因为不需要第二个网站来利用此漏洞。

预防

虽然适当的预防措施可能取决于具体情况,但我建议从以下 2 个选项开始:

  1. 如果必须显示非信任输入,请始终对其进行编码,以便将 <script> 编码为 &lt;script&gt; 并简单地显示,而不是作为脚本标签执行。

  2. 如果用户提交的输入必须逐字显示(例如:允许用户设置帖子样式的论坛),请考虑使用支持允许元素和属性白名单的 HTML Sanitisation 工具。 应该拒绝违反 HTML Sanitiser 配置的用户提交的输入。

我不建议尝试像我在 在 .NET Core WebAPI 中防止 XSS 中提到的那样,预先清理所有传入请求。 在实践中,我发现这是不可行的,并且简单地在输出时对数据进行编码往往是更好的方法。

<script> document.write(‘Damn’); </script>

这就是我要说的全部内容! 你们是否在野外遇到过 XSS 漏洞,或者你们是否有我没有提到的其他用于防止 XSS 的工具? 请在评论中告诉我。

再见!

© . All rights reserved.