详解JSON和JSONP劫持以及解决方法


Posted in Javascript onMarch 08, 2019

json劫持

json劫持攻击又为”JSON Hijacking”,攻击过程有点类似于csrf,只不过csrf只管发送http请求,但是json-hijack的目的是获取敏感数据。

一些web应用会把一些敏感数据以json的形式返回到前端,如果仅仅通过cookie来判断请求是否合法,那么就可以利用类似csrf的手段,向目标服务器发送请求,以获得敏感数据。

比如下面的链接在已登录的情况下会返回json格式的用户信息:

http://www.test.com/userinfo

攻击者可以在自己的虚假页面中,加入如下标签:

<script src="http://www.test.com/userinfo"></script>

如果当前浏览器已经登录了www.test.com,并且cookie未过期,然后访问了攻击者的虚假页面,那么该页面就可以拿到json形式的用户敏感信息,因为script标签会自动解析json数据,生成对应的js对象。然后再通过

Object.prototype.__defineSetter__

这个函数来触发自己的恶意代码。

但是这个函数在当前的新版本chrome和firefox中都已经失效了。

jsonp劫持

jsonp是一个非官方的协议,利用script元素的开放策略,网页可以得到从其他来源动态产生的json数据,因此可以用来实现跨域。(关于JSONP可以参考我的博文:https://3water.com/article/31167.htm)

web程序如果通过这种方式跨域之后,攻击者完全可以在自己的虚假页面中发起恶意的jsonp请求,这就引来了安全问题。比如:

<script>
function useUserInfo(v){
  alert(v.username);
}
</script>
<script src="http://www.test.com/userinfo?callback=useUserInfo"></script>

如果服务器端的userinfo接口支持jsonp,那就会使虚假页面成功执行useUserInfo函数,从而导致安全问题。

解决方法

其实json劫持和jsonp劫持属于CSRF( Cross-site request forgery 跨站请求伪造)的攻击范畴,所以解决的方法和解决csrf的方法一样。

1、验证 HTTP Referer 头信息;
2、在请求中添加 csrfToken 并在后端进行验证;

关于CSRF攻击可以参考我的博文:https://3water.com/article/157550.htm 

PS:JSONP劫持漏洞实例

getUser.php

<?php
header('Content-type: application/json');
$jsoncallback = htmlspecialchars($_REQUEST ['jsoncallback']);//获取回调函数名
//json数据
//$json_data = '["id","user"]';
$json_data='({"id":"1","name":"Aaron"})';
echo $jsoncallback . "(" . $json_data . ")";//输出jsonp格式的数据
?>

Payload利用:

客户端实现 callbackFunction 函数

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JSONP劫持测试</title>
</head>
<body>
<script type="text/javascript">
function callbackFunction(result)
    {
      alert(result.name);
    }
</script>
<script type="text/javascript" src="http://127.0.0.1/test/getUser.php?jsoncallback=callbackFunction"></script>
</body>
</html>

jQuery 使用 JSONP

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JSONP劫持测试</title>
  <script src="http://cdn.static.runoob.com/libs/jquery/1.8.3/jquery.js"></script>  
</head>
<body>
<div id="divCustomers"></div>

<script type="text/javascript">  
  $.getJSON("http://127.0.0.1/test/getUser.php?jsoncallback=?", function(getUsers){
     alert(getUsers.name);
  });
</script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。权声明:本文为博主原创文章,转载请附上博文链接!

Javascript 相关文章推荐
JavaScript窗口功能指南之在窗口中书写内容
Jul 21 Javascript
Add Formatted Data to a Spreadsheet
Jun 12 Javascript
检测是否已安装 .NET Framework 3.5的js脚本
Feb 14 Javascript
jquery的index方法实现tab效果
Feb 16 Javascript
JS中如何设置readOnly的值
Dec 25 Javascript
parentElement,srcElement的使用小结
Jan 13 Javascript
jquery插件开发之实现google+圈子选择功能
Mar 10 Javascript
JavaScript实现大数的运算
Nov 24 Javascript
JS动态添加选项案例分析
Oct 17 Javascript
JSON与js对象序列化实例详解
Mar 16 Javascript
详解angular2实现ng2-router 路由和嵌套路由
Mar 24 Javascript
VUE 解决mode为history页面为空白的问题
Nov 01 Javascript
Node.js Event Loop各阶段讲解
Mar 08 #Javascript
vue基础之data存储数据及v-for循环用法示例
Mar 08 #Javascript
vue.js使用v-model实现表单元素(input) 双向数据绑定功能示例
Mar 08 #Javascript
JavaScript解析机制与闭包原理实例详解
Mar 08 #Javascript
零基础之Node.js搭建API服务器的详解
Mar 08 #Javascript
详解vue项目中使用token的身份验证的简单实践
Mar 08 #Javascript
Javascript之高级数组API的使用实例
Mar 08 #Javascript
You might like
用PHP书写安全的脚本代码
2012/02/05 PHP
VB中的RasEnumConnections函数返回632错误解决方法
2014/07/29 PHP
PHP编程开发怎么提高编程效率 提高PHP编程技术
2015/11/09 PHP
php 数组随机取值的简单实例
2016/05/23 PHP
php基于curl实现随机ip地址抓取内容的方法
2016/10/11 PHP
tp5(thinkPHP5框架)captcha验证码配置及验证操作示例
2019/05/28 PHP
PHP基于swoole多进程操作示例
2019/08/12 PHP
用Javscript实现表单复选框的全选功能
2007/05/25 Javascript
Javascript valueOf 使用方法
2008/12/28 Javascript
HTML5附件拖拽上传drop &amp; google.gears实现代码
2011/04/28 Javascript
基于jquery的textarea发布框限制文字字数输入(添加中文识别)
2012/02/16 Javascript
jquery $.each()使用探讨
2013/09/23 Javascript
提取字符串中年月日的函数代码
2013/11/05 Javascript
二叉树的非递归后序遍历算法实例详解
2014/02/07 Javascript
推荐一个封装好的getElementsByClassName方法
2014/12/02 Javascript
Javascript基础教程之关键字和保留字汇总
2015/01/18 Javascript
BootStrap.css 在手机端滑动时右侧出现空白的原因及解决办法
2016/06/07 Javascript
利用JavaScript判断浏览器类型及版本
2016/08/23 Javascript
详解Vue 换肤方案验证
2019/08/28 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
2020/09/16 Javascript
npm全局环境变量配置详解
2020/12/15 Javascript
使用python检测手机QQ在线状态的脚本代码
2013/02/10 Python
Python使用QRCode模块生成二维码实例详解
2017/06/14 Python
PyQt5实现拖放功能
2018/04/25 Python
在pycharm中python切换解释器失败的解决方法
2018/10/29 Python
Python pandas RFM模型应用实例详解
2019/11/20 Python
详解django中Template语言
2020/02/22 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
2020/04/22 Python
BONIA波尼亚新加坡官网:皮革手袋,鞋类和配件
2016/08/25 全球购物
Seavenger官网:潜水服、浮潜、靴子和袜子
2020/03/05 全球购物
酒店服务与管理毕业生求职信
2013/11/02 职场文书
在职党员进社区活动总结
2014/07/05 职场文书
平安工地汇报材料
2014/08/19 职场文书
业绩倒数第一的检讨书
2014/09/24 职场文书
25张裸眼3D图片,带你重温童年的记忆,感受3D的魅力
2022/02/06 杂记
Win11快速关闭所有广告推荐
2022/04/19 数码科技