反射型 XSS 在今天仍然有用吗?

信息安全 xss javascript 反射-xss
2021-09-02 21:50:10

我一直在学习有关 XSS 的更多信息(对于不熟悉的人,Excess XSS是一个很好的资源)。我选择亲自动手并在本地环境中尝试 Reflected XSS。我设置了一个在 Apache2 上运行的非常简单的易受攻击的 PHP 页面,它采用 URL 参数并将内容转储到页面中:

<!DOCTYPE html>
<html>
<head>
    <title>VULNERABLE WEBSITE</title>
</head>
<body style="background-color:#98FB98">
    <h1>VULNERABLE WEBSITE</h1>
    <p>Search results for <?php echo $_GET['query']; ?>:</p>
</body>
</html>

然后,我尝试使用如下 URL 将“恶意”JavaScript 嵌入到页面中:

http://localhost:8082/?query=<script>alert('Hello!');</script>

我发现浏览器本身阻止了这种情况的发生。在 Firefox 中,这将我带到了 Google 搜索页面。在 Chromium 中,XSS 被专门检测并阻止:

在此处输入图像描述

所以,从理论到实践,我现在想知道:Reflected XSS 在今天仍然是一个相关的安全问题吗?

这显然不适用于恶意内容由网站本身直接提供的持久性 XSS。

4个回答

反射型 XSS 不仅仅通过 GET。它也可以通过POST。并且它们并不总是被浏览器阻止。当然,仍然是相关的。

几个定义:

并且来自 Checkmarx 知识库,它说:“最常见的 XSS ”。从这里提取所以如果是最常见的,我猜仍然是相关的。

是的,今天所有形式的 XSS 仍然适用。

您尝试的特定攻击对于浏览器来说是很明显的启发式发现,但更微妙的注入生成的代码可能不是。如果我因为开发人员使用而更改了表单的提交 URL<form action="{$_SERVER['PHP_SELF']}"怎么办?如果我将您的错误消息更改为确认消息怎么办?如果我更改您下载的 Linux 发行版的 SHA1 哈希值会怎样?

永远不要依赖客户端功能(尤其是 Web 浏览器)为您的用户提供安全性。

反射型 XSS 最常见和最琐碎的情况——你从字面上准确地输出提供的内容 ( <?php echo $_GET['query']; ?>) 并且它按原样运行——默认情况下在现代浏览器中实际上并不相关,不。

然而,“反射型 XSS”作为一个类别比这更广泛一些。它还包括输入以某种方式编码的情况。我在野外看到的一个例子是 base64 编码 HTML 的反射,例如<?php echo base64_decode($_GET['query']); ?>. 浏览器过滤器可能无法捕捉到这一点。

您还需要考虑代码不能自行运行的情况,但还有一些其他 JavaScript 会导致它稍后运行。发生这种情况的最常见方式是客户端模板库,它可以解释静态文本中的表达式。例如,考虑在dyn-客户端使用一些模型数据评估属性的这种情况:

<img dyn-src="model.get('<?php echo $_GET['name']; ?>')" />
<script>
  let model = { something... };
  for (let el of document.querySelectorAll('[dyn-src]')) {
    el.src = eval(el.getAttribute('dyn-src'));
  }
</script>

这允许使用类似 的反射 XSS 形式?name=', alert('xss'), ',浏览器也可能无法捕获。

反射型 XSS 仍然相关,因为并非每个浏览器都以相同的方式实现相同的过滤器,有时会发现某些实现的绕过,因此审核员可能不会阻止它。

有些网站没有X-XSS-Protection启用标头,因此这些网站也很容易受到攻击

并且,正如在其他答案中所说,有效载荷可以通过POST而不是传递GET,防止审计员阻止恶意注入

最后,即使一切配置正确并且没有已知的过滤器实现旁路,它也只是一个过滤器。它会阻止某些反射的 XSS,但由于存在误报,因此误报过多,因此有效载荷仍然未被检测到