详解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加解密功能页面
Dec 12 Javascript
Exjs 入门篇
Apr 07 Javascript
ie下动态加态js文件的方法
Sep 13 Javascript
使用js检测浏览器的实现代码
May 14 Javascript
js中parseInt函数浅谈
Jul 31 Javascript
原生js和jquery实现图片轮播淡入淡出效果
Apr 23 Javascript
VUE开发一个图片轮播的组件示例代码
Mar 06 Javascript
原生js中ajax访问的实例详解
Sep 19 Javascript
微信小程序实现获取自己所处位置的经纬度坐标功能示例
Nov 30 Javascript
基于vue+uniapp直播项目实现uni-app仿抖音/陌陌直播室功能
Nov 12 Javascript
js的Object.assign用法示例分析
Mar 05 Javascript
Vue的Options用法说明
Aug 14 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
smarty section简介与用法分析
2008/10/03 PHP
Drupal7连接多个数据库及常见问题解决
2014/03/02 PHP
PHP实现生成透明背景的PNG缩略图函数分享
2014/07/08 PHP
PHP中iconv函数转码时截断字符问题的解决方法
2015/01/21 PHP
PHP生成和获取XML格式数据的方法
2016/03/04 PHP
PHP 匿名函数与注意事项详细介绍
2016/11/26 PHP
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
关于laravel后台模板laravel-admin select框的使用详解
2019/10/03 PHP
js获取IP和PcName(IE)在vs中可用
2013/08/02 Javascript
js AppendChild与insertBefore用法详细对比
2013/12/16 Javascript
node.js中的path.dirname方法使用说明
2014/12/09 Javascript
nodejs开发微博实例
2015/03/25 NodeJs
JQuery鼠标移到小图显示大图效果的方法
2015/06/10 Javascript
js带前后翻页的图片切换效果代码分享
2015/09/08 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
2016/12/14 Javascript
layui select动态添加option的实例
2018/03/07 Javascript
vue 列表页跳转详情页获取id以及详情页通过id获取数据
2019/03/27 Javascript
vue下载excel的实现代码后台用post方法
2019/05/10 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
2019/12/16 Javascript
vue.js自定义组件实现v-model双向数据绑定的示例代码
2020/01/08 Javascript
js实现数据导出为EXCEL(支持大量数据导出)
2020/03/31 Javascript
[03:11]不朽宝藏三外观展示
2020/09/18 DOTA
在Python中使用Neo4j的方法
2019/03/14 Python
python识别图像并提取文字的实现方法
2019/06/28 Python
window7下的python2.7版本和python3.5版本的opencv-python安装过程
2019/10/24 Python
Python自动创建Excel并获取内容
2020/09/16 Python
美体小铺英国官网:The Body Shop英国
2017/01/24 全球购物
NFL加拿大官方网上商店:NHLShop.ca
2019/03/12 全球购物
荷兰最大的多品牌男装连锁店:Adam Brandstore
2019/12/31 全球购物
满月酒主持词
2014/03/27 职场文书
小学德育工作经验交流材料
2014/05/22 职场文书
教师反腐倡廉演讲稿
2014/09/03 职场文书
2015年社区统计工作总结
2015/04/21 职场文书
2015年食堂工作总结报告
2015/04/23 职场文书
小学安全工作总结2015
2015/05/18 职场文书
FP-growth算法发现频繁项集——构建FP树
2021/06/24 Python