zoukankan      html  css  js  c++  java
  • JSONP(JSON with Padding)

    JSONP攻防实例解析

    前言

    纸上得来终觉浅,绝知此事要躬行。

    关于JSONP

    Jsonp(JSON with Padding)是一种跨域请求资源的解决方案,JSONP可以绕过AJAX遵循的同源策略。

    菜鸟教程存在数据(["customername1","customername2"]),我们希望在本地展示,由于受同源策略的限制,AJAX无法调用该页面。代码如下:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>JSONP 实例</title>
    <script type="text/javascript">
    
    var request = new XMLHttpRequest(); 
    
    request.onreadystatechange = function () {
        if (request.readyState === 4) { 
            // 判断响应结果:
            if (request.status === 200) {
                // 成功,通过responseText拿到响应的文本:
                document.getElementById("text").innerHTML=xmlhttp.responseText;
            } else {
                // 失败,根据响应码判断失败原因:
                return request.status;
            }
        } 
    }
    // 发送请求:
    request.open('GET', 'http://www.runoob.com/try/ajax/jsonp.php');
    request.send();
    
    </script>
    </head>
    <body>
    	<div id="text"></div>
    </body>
    </html>
    

    访问测试:python -m SimpleHTTPServer开启HTTP服务器,默认端口8000,开启console结果如下

    Callback

    为了更好的使用第三方数据,第三方允许请求方使用自定义的callback名称。例如:http://www.runoob.com/try/ajax/jsonp.php?jsoncallback=test,这里的jsoncallback参数是可以自定义的。

    JSONP应用

    菜鸟教程给出了一个demo

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>JSONP 实例</title>
    </head>
    <body>
        <div id="divCustomers"></div>
        <script type="text/javascript">
    function callbackFunction(result, methodName)
            {
                var html = '<ul>';
                for(var i = 0; i < result.length; i++)
                {
                    html += '<li>' + result[i] + '</li>';
                }
                html += '</ul>';
                document.getElementById('divCustomers').innerHTML = html;
            }
    </script>
    <script type="text/javascript" src="http://www.runoob.com/try/ajax/jsonp.php?jsoncallback=callbackFunction"></script>
    </body>
    </html>
    

    访问测试结果如下:

    安全问题

    JSON劫持

    详见WooYun-2012-11284,自己写了一个demo,大牛勿喷。

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>JSON 劫持</title>
    
    <script>
    var info = {
    	"name":"admin",
    	"passwd":"123456" 
    };
    function displayAuth(){
    	document.getElementById("name").innerHTML=info.name; 
    	document.getElementById("passwd").innerHTML=info.passwd; 
    }
    
    </script>
    
    </head>
    <body>
    
    用户名: <span id="name"></span><br /> 
    密码: <span id="passwd"></span><br /> 
    
    <button type="button" onclick="displayAuth()">secret</button>   
    </body>
    </html>
    
    

    点击secret按钮,显示用户名和密码。

    XSS漏洞

    参考知道创宇给出的demo,访问http://127.0.0.1/getUsers.php?callback=<script>alert(/xss/)</script>即可触发。

    <?php
    //getUsers.php
    $callback = $_GET['callback'];
    print $callback.'({"id" : "1","name" : "知道创宇"});';
    ?>
    

    防护

    1. 检查Referer是否合法,因为请求是从攻击页面发起的,所以Referer是攻击页面的URL。
    2. 过滤callback函数名及JSON里数据的输出。

    绕过

    空Referer绕过

    开发者由于疏忽大意,忘记设置空Referer的过滤。此时我们可以跨协议调用:<iframe src="javascript:'<script>function JSON(o){alert(o.userinfo.userid);}</script><script src=http://www.qq.com/login.php?calback=JSON></script>'"></iframe>
    代码里我们使用<iframe>调用javscript伪协议来实现空Referer调用JSON文件。

    参考;

    http://www.runoob.com/json/json-jsonp.html

    https://www.freebuf.com/articles/web/126347.html

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

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

  • 相关阅读:
    测试小技巧之常用工具
    测试小技巧之浏览器插件
    可变参数列表
    对象属性和数组元素的初始默认值
    静态块(变量)和非静态块(变量)
    类初始化顺序
    基本类型的重载规则
    构造器访问权限控制
    MySQL Server架构图
    递归与非递归实现树的遍历(java)
  • 原文地址:https://www.cnblogs.com/mark-zh/p/10491347.html
Copyright © 2011-2022 走看看