详解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编程起步(第五课)
Jan 10 Javascript
JavaScript的9种继承实现方式归纳
May 18 Javascript
jQuery实现给页面换肤的方法
May 30 Javascript
jQuery实现checkbox全选的方法
Jun 10 Javascript
js中不同的height, top的区别对比
Sep 24 Javascript
javascript倒计时效果实现
Nov 12 Javascript
easyui取消表单实时验证,提交时统一验证的简单实例
Nov 07 Javascript
Node.js批量给图片加水印的方法
Nov 15 Javascript
vue不通过路由直接获取url中参数的方法示例
Aug 24 Javascript
Vue.js进行查询操作的实例详解
Aug 25 Javascript
vue内置组件transition简单原理图文详解(小结)
Jul 12 Javascript
微信小程序image图片加载完成监听
Aug 31 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 编程的 5个良好习惯
2009/02/20 PHP
php 分页函数multi() discuz
2009/06/21 PHP
一个经典的PHP验证码类分享
2014/11/18 PHP
php将字符串全部转换成大写或者小写的方法
2015/03/17 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
2017/10/19 PHP
实例介绍PHP中zip_open()函数用法
2019/02/15 PHP
让mayfish支持mysqli数据库驱动的实现方法
2010/05/22 Javascript
高效的表格行背景隔行变色及选定高亮的JS代码
2010/12/04 Javascript
jsp+javascript打造级连菜单的实例代码
2013/06/14 Javascript
利用jquery写的左右轮播图特效
2014/02/12 Javascript
两款JS脚本判断手机浏览器类型跳转WAP手机网站
2015/10/16 Javascript
jQuery EasyUI 布局之动态添加tabs标签页
2015/11/18 Javascript
Jquery EasyUI实现treegrid上显示checkbox并取选定值的方法
2016/04/29 Javascript
javascript之Boolean类型对象
2016/06/07 Javascript
纯JS前端实现分页代码
2016/06/21 Javascript
Node.js中的require.resolve方法使用简介
2017/04/23 Javascript
JavaScript事件方法(实例讲解)
2017/06/27 Javascript
vue中设置height:100%无效的问题及解决方法
2018/07/27 Javascript
vue实现element-ui对话框可拖拽功能
2018/08/17 Javascript
PM2自动部署代码步骤流程总结
2018/12/10 Javascript
mocha的时序规则讲解
2019/02/16 Javascript
js定时器出现第一次延迟的原因及解决方法
2021/01/04 Javascript
Python xlwt设置excel单元格字体及格式
2020/04/18 Python
python爬虫爬取快手视频多线程下载功能
2018/02/28 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
2019/03/27 Python
使用 Python 读取电子表格中的数据实例详解
2020/04/17 Python
django正续或者倒序查库实例
2020/05/19 Python
html5 canvas 简单画板实现代码
2012/01/05 HTML / CSS
美国电视购物:QVC
2017/02/06 全球购物
台湾前三大B2C购物网站:MOMO购物网
2017/04/27 全球购物
Java面试笔试题大全
2016/11/23 面试题
《老王》教学反思
2014/02/23 职场文书
公司会计主管岗位责任制
2014/03/01 职场文书
车辆年审委托书范本
2014/09/18 职场文书
领导干部作风建设总结
2014/10/23 职场文书
mybatis中sql语句CDATA标签的用法说明
2021/06/30 Java/Android