首页
社区
课程
招聘
JSONP和CORS跨域漏洞学习笔记
发表于: 2021-7-22 22:07 2251

JSONP和CORS跨域漏洞学习笔记

2021-7-22 22:07
2251

最近研究了一下这个,实战中还没遇到过,也可能存在只是我没发现,小记!

两个地址的协议域名端口都一样则为同源

image-20210720134100523

image-20210720134813767

Tips:同源策略是浏览器行为,拦截的是客户端发出去的请求,该请求返回的信息,也就是请求发出去了,服务器响应了,但是无法被浏览器接收。

Tips1:同源策略只存在于浏览器端,服务器访问服务器不存在跨域问题。

不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。只有同一个源的脚本才可以赋予dom、读写cookie、session、ajax等操作的权限,例如a.com可以随意调用b.com的接口去修改数据

以上三个标签可以允许跨域加载资源

利用标签元素,网页可以得到从其他来源动态产生的JSON资料,而这种模式就是所谓的Jsonp,用Jsonp抓到的资料并不是Json,而是任意的JavaScript。

Jsonp跨域的原理本质就是利用的标签有跨域的属性

在不同源的情况下

这里没有使用本地搭建两个不同的端口来访问html服务,而是使用douban的网址来测试

image-20210720142443765

同源的情况下

image-20210720142614764

跨域访问

image-20210720142822939

JSONP实现跨域请求的原理简单的说,就是动态创建<script>标签,然后利用<script>的src 不受同源策略约束来跨域获取数据。

JSONP 由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数。回调函数的名字一般是在请求中指定的。而数据就是传入回调函数中的 JSON 数据。

动态创建<script>标签,设置其src,回调函数在src中设置

在页面中,返回的JSON作为参数传入回调函数中,我们通过回调函数来来操作数据。

完整代码

image-20210720144321147

漏洞页面为

image-20210720144431284

攻击页面

受害者点击页面

image-20210720144557241

其实网上的文章复现对这里并没有说的很清楚,照着复现演示看上去也比较模糊,大概的意思我理解的是漏洞页面(http://10.200.70.27/vul/DoraBox/csrf/jsonp.php?callback=test)要获取这些数据,是需要登录的,受害者登录后,又访问了攻击者给的漏洞劫持复现链接(http://10.200.70.27:8081/exp.html),就造成了攻击者可以获取这些数据,同源策略规定,不同的源是不可以获取cookie这些的,很显然,用户登录后的cookie,不同源是不可以获取的,这里通过标签属性的特性,获取到了不同源用户的Cookie

1、验证Referer

2、增加随机的Token进行验证

在phpstudy中开启,删掉前面的#号并在配置文件的最开头配置header然后重启服务

这一步不是必须设置,通过复现测试发现,如果php中写了,这里好像可以不用设置

image-20210720145553209

image-20210720145841587

请求头存在origin参数且可控(不存在可自行添加不影响结果)

响应头存在下面两个:

Burp重放

image-20210720152023286

如何判断是否存在跨域攻击,可以在请求头中添加一个源,看看是否可控

image-20210720152007195

模拟受害者点击

image-20210720153212205

首先你判断是否请求头里面是否有Origin如果有,就讲header设置为(Access-Control-Allow-Origin: "传进来的Origin")如果没有就设置为*,在设置不同的header,最后echo json

把这些header删掉,就会触发同源策略,就无法获得想要的json信息

image-20210720154126549

删掉后还是正常输出json内容

image-20210720154143973

但是使用不同域模拟受害者点击的时候就会提示

image-20210720154221640

同源策略不允许其他的源访问,所以如果错误的配置了Access-Control-Allow-Origin,导致攻击者可以控制这个Origin的话,就会导致我只需要指定当前访问地址的源即可。

如果使用Access-Control-Allow-Origin来处理跨域的话,如果没有传入Origin参数,那么就会使用默认的值,这个默认的值浏览器会将当前的host传进去,所以在请求中可以看到返回包里面Origin是当前的host

image-20210720155652341

image-20210720155756120

参考文章

1、https://blog.csdn.net/weixin_41679427/article/details/110312388

2、https://www.imooc.com/article/291931

3、http://www.ruanyifeng.com/blog/2016/04/cors.html

4、https://blog.csdn.net/weixin_41598660/article/details/106050957

5、https://www.cnblogs.com/csnd/p/11807709.html

 
 
 
 
<img/>
<link/>
<script/>
<img/>
<link/>
<script/>
 
 
 
<!-- 以上同源与不同源的测试代码 -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ajax</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
    <div id="mydiv">
        <button id="btn">点击</button>
    </div>
</body>
<script type="text/javascript">
    window.onload = function() {
 
    var oBtn = document.getElementById('btn');
 
    oBtn.onclick = function() {
 
        var xhr = new XMLHttpRequest();
 
        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4 && xhr.status == 200) {
                    alert( xhr.responseText );
            }
        };
 
        xhr.open('get', 'http://10.200.70.27/vul/DoraBox/csrf/jsonp.php?callback=test', true);
        xhr.send();
    };
 
};
</script>
</html>
<!-- 以上同源与不同源的测试代码 -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ajax</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
    <div id="mydiv">
        <button id="btn">点击</button>
    </div>
</body>
<script type="text/javascript">
    window.onload = function() {
 
    var oBtn = document.getElementById('btn');
 
    oBtn.onclick = function() {
 
        var xhr = new XMLHttpRequest();
 
        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4 && xhr.status == 200) {
                    alert( xhr.responseText );
            }
        };
 
        xhr.open('get', 'http://10.200.70.27/vul/DoraBox/csrf/jsonp.php?callback=test', true);
        xhr.send();
    };
 
};
</script>
</html>
 
 
 
 
var script = document.createElement("script");
script.src = "https://api.douban.com/v2/book/search?q=javascript&count=1&callback=handleResponse";
document.body.insertBefore(script, document.body.firstChild);
var script = document.createElement("script");
script.src = "https://api.douban.com/v2/book/search?q=javascript&count=1&callback=handleResponse";
document.body.insertBefore(script, document.body.firstChild);
function handleResponse(response){
    // 对response数据进行操作代码
}
function handleResponse(response){
    // 对response数据进行操作代码
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JSONP实现跨域2</title>
</head>
<body>
    <div id="mydiv">
        <button id="btn">点击</button>
    </div>
</body>
<script type="text/javascript">
    function handleResponse(response){
            console.log(response);
    }
</script>
<script type="text/javascript">
    window.onload = function() {
 
    var oBtn = document.getElementById('btn');
 
    oBtn.onclick = function() {    
 
        var script = document.createElement("script");
        script.src = "https://api.douban.com/v2/book/search?q=javascript&count=1&callback=handleResponse";
        document.body.insertBefore(script, document.body.firstChild);  
    };
};
</script>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JSONP实现跨域2</title>
</head>
<body>
    <div id="mydiv">
        <button id="btn">点击</button>
    </div>
</body>
<script type="text/javascript">
    function handleResponse(response){
            console.log(response);
    }
</script>
<script type="text/javascript">
    window.onload = function() {
 
    var oBtn = document.getElementById('btn');
 

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 2
支持
分享
最新回复 (2)
雪    币: 6
活跃值: (1151)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
文章写的还是不够透明
2021-7-27 08:48
0
雪    币: 452
活跃值: (6128)
能力值: ( LV12,RANK:580 )
在线值:
发帖
回帖
粉丝
3
lookzo 文章写的还是不够透明
结合实战靶场试试 就能理解了
2021-7-27 10:10
0
游客
登录 | 注册 方可回帖
返回
//