网站可以向“localhost”发出 HTTP 请求吗?它如何绕过跨域策略?

信息安全 javascript 阿贾克斯 跨域
2021-08-31 11:35:39

我发现这个网站讨论了通过利用相同的漏洞来修复 Redis 漏洞。

有问题的网站有一个“给我打补丁”按钮,如果你的机器上运行着无密码的 Redis 服务器,它会打补丁。

也就是说,网站本身连接到你电脑中的 Redis Server并执行一些命令。

如果您查看您发现的网站代码,可以预见的是:

    var text = "the code to run";
    var bad = "EVAL "  + JSON.stringify(text) + " 0\r\n";
    var x = new XMLHttpRequest();
    x.open("POST", "http://localhost:6379");
    x.send(bad);

令我惊讶的是,这行得通!

我认为跨域策略会阻止它运行,但事实并非如此。

为什么这行得通,我现在怎么能不偏执于我进入的每个网站都在读取我的 Redis 服务器的全部内容?

是因为只写不读吗?尽管如此,世界上的任何网站都可以清空我的本地 Redis 服务器/写入任何其他监听我机器中端口的东西,而无需身份验证。

我在这里错过了什么吗?

2个回答

我很惊讶没有人指出接受的答案(由meldownmonk)是错误的。

“它不会破坏跨域策略,因为请求不会跨域。它将保持本地。避免跨域策略的一种方法是让目标受害者自己发出 HTTP 请求。因此请求永远不会跨域。 "

“连接到您的 Redis 机器的不是网站本身。而是您连接到您的 Redis 机器,执行您通过单击链接运行的客户端代码/脚本”

“攻击者无法完全控制该过程。他们依赖 Redis 服务器的所有者来执行代码。”

“......执行它们的不是攻击者,而是所有者,因此不会违反跨域策略。”

这不是同源策略 (SOP) 和跨源资源共享 (CORS) 的工作方式。当然,当网站尝试连接到 localhost 时,请求将跨域。此外,是网站本身试图连接到您的 redis,而不是用户 - 攻击者不必依赖用户。代码是在后台自动运行还是用户单击按钮没有区别。

网站基本上能够在不同的端口上向 localhost 发送请求,从而甚至可以运行端口扫描。浏览器的 CORS 实现将确保 javascript 无法读取数据。因此,攻击者无法从本地主机窃取数据并将其发送到服务器。当然,只要您在 localhost 上的服务没有明确允许发出 CORS 请求(当它们发送 allow-origin 标头时,攻击者可以窃取数据),这当然是正确的。

除此之外,请求仍然是可能的,因此 CSRF 攻击也是可能的。这样的 CSRF 攻击可以通过一个简单的 javascript HTTP 请求(不需要 CORS 预检检查)触发,但也可以使用通过 GET/POST 和 websockets 发送的 HTML 表单数据来建立与本地服务的连接。

综上所述,如果您访问一个网站,该网站将能够向您计算机上不同端口上的本地服务发送请求。从本地服务读取数据通常是不可能的。

由于对以下答案错误的问题的错误假设而被指出。如果我有机会,我会重新访问,或者只是删除这个答案。对不起!

回答这个问题:是的,网站可以向 localhost 发出 HTTP 请求。它不会破坏跨域策略,因为请求不会跨域。它将保持本地化。避免跨域策略的一种方法是让目标受害者自己发出 HTTP 请求。因此,请求永远不会跨域。

为了帮助您理解您描述的问题:

攻击不会发送任何数据,也不会与本地 Redis 机器以外的任何地方建立连接。它不是连接到您的 Redis 机器的网站本身。连接到您的 Redis 机器,执行通过单击链接运行的客户端代码/脚本。基本上:您单击链接>链接下载并执行一些代码->代码生成一个http请求->http请求从您的机器发送到您的机器。

这种情况下Redis服务器的漏洞就是Cross Site Request Forgery。攻击者利用受害者(在本例中为服务器的所有者)身份验证来执行攻击。

攻击者无法完全控制该过程。他们依赖 Redis 服务器的所有者来执行代码。只有所有者(或 Redis 服务器本地的其他人)具有访问 127.0.0.1(本地主机)的可见性(可能还有权限和信任关系)

代码所能做的就是执行本地用户可以执行的命令,但执行它们的不是攻击者,而是所有者,因此不会违反跨域策略。

唯一受此类链接影响的人是运行 Redis 服务器的人。如果您没有,链接将不会做任何事情。此外,它只会在本地 Redis 服务器上运行。攻击者无法真正选择漏洞发生的位置。

查找跨站请求伪造。 https://en.wikipedia.org/wiki/Cross-site_request_forgery