详解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 相关文章推荐
js打印纸函数代码(递归)
Jun 18 Javascript
jquery键盘事件介绍
Jan 31 Javascript
js/jquery获取浏览器窗口可视区域高度和宽度以及滚动条高度实现代码
Dec 17 Javascript
js中的异常处理try...catch使用介绍
Sep 21 Javascript
JS与C#编码解码
Dec 03 Javascript
js验证IP及子网掩码的合法性有效性示例
Apr 30 Javascript
JavaScript使用DeviceOne开发实战(一) 配置和起步
Dec 01 Javascript
JavaScript提高性能知识点汇总
Jan 15 Javascript
js实现自定义进度条效果
Mar 15 Javascript
JS实现二维数组元素的排列组合运算简单示例
Jan 28 Javascript
jquery将信息遍历到界面上实例代码
Jan 21 jQuery
jQuery实现移动端笔触canvas电子签名
May 21 jQuery
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中for与foreach的区别分析
2011/03/09 PHP
PHP代码保护--Zend Guard的使用详解
2013/06/03 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
Zend Framework处理Json数据方法详解
2016/12/09 PHP
PHP Redis扩展无法加载的问题解决方法
2019/08/22 PHP
tp5 sum某个字段相加得到总数的例子
2019/10/18 PHP
javascript 哈希表(hashtable)的简单实现
2010/01/20 Javascript
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
2011/02/18 Javascript
jQuery中使用data()方法读取HTML5自定义属性data-*实例
2014/04/11 Javascript
JavaScript 模块化编程(笔记)
2015/04/08 Javascript
JavaScript中Window对象的属性及事件
2015/12/25 Javascript
jQuery简单实现页面元素置顶时悬浮效果示例
2016/08/01 Javascript
Bootstrap文件上传组件之bootstrap fileinput
2016/11/25 Javascript
JS实现的简单轮播图运动效果示例
2016/12/22 Javascript
Node.js中用D3.js的方法示例
2017/01/16 Javascript
支持移动端原生js轮播图
2017/02/16 Javascript
详解Webpack DLL用法以及功能
2017/07/11 Javascript
vue中axios解决跨域问题和拦截器的使用方法
2018/03/07 Javascript
layer弹出的iframe层在执行完毕后关闭当前弹出层的方法
2018/08/17 Javascript
vue.js中toast用法及使用toast弹框的实例代码
2018/08/27 Javascript
小程序input数据双向绑定实现方法
2019/10/17 Javascript
修改vue源码实现动态路由缓存的方法
2020/01/21 Javascript
JS中类的静态方法,静态变量,实例方法,实例变量区别与用法实例分析
2020/03/14 Javascript
python实现批量监控网站
2016/09/09 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
2019/07/11 Python
python 实现在无序数组中找到中位数方法
2020/03/03 Python
python绘制趋势图的示例
2020/09/17 Python
Python解析微信dat文件的方法
2020/11/30 Python
html5 input元素新特性_动力节点Java学院整理
2017/07/06 HTML / CSS
video下autoplay属性无效的解决方法(添加muted属性)
2020/05/19 HTML / CSS
幼儿园教研活动方案
2014/01/19 职场文书
护士长竞聘书
2014/03/31 职场文书
二手房购房协议书范本
2014/10/05 职场文书
小学开学典礼新闻稿
2015/07/17 职场文书
2016银行求职自荐信
2016/01/28 职场文书
CSS实现多个元素在盒子内两端对齐效果
2021/03/30 HTML / CSS