详解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 相关文章推荐
ajaxControlToolkit AutoCompleteExtender的用法
Oct 30 Javascript
jQuery源码分析-03构造jQuery对象-工具函数
Nov 14 Javascript
js 可拖动列表实现代码
Dec 13 Javascript
Jquery同辈元素选中/未选中效果的实例代码
Aug 01 Javascript
Jquery解析json数据详解
Dec 26 Javascript
js实现鼠标划过给div加透明度的方法
May 25 Javascript
JavaScript使用DeviceOne开发实战(三)仿微信应用
Dec 02 Javascript
关于function类中定义变量this的简单说明
May 28 Javascript
使用jQuery和ajax代替iframe的方法(详解)
Apr 12 jQuery
Angular实现类似博客评论的递归显示及获取回复评论的数据
Nov 06 Javascript
Puppeteer 爬取动态生成的网页实战
Nov 14 Javascript
vue实现局部刷新的实现示例
Apr 16 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正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
2013/08/13 PHP
初识php MVC
2014/09/10 PHP
thinkPHP5.0框架命名空间详解
2017/03/18 PHP
php插件Xajax使用方法详解
2017/08/31 PHP
Laravel框架实现简单的学生信息管理平台案例
2019/05/07 PHP
js加载读取内容及显示与隐藏div示例
2014/02/13 Javascript
判断及设置浏览器全屏模式
2014/04/20 Javascript
js实现飞入星星特效代码
2014/10/17 Javascript
jQuery如何使用自动触发事件trigger
2015/11/29 Javascript
jQuery获取父元素节点、子元素节点及兄弟元素节点的方法
2016/04/14 Javascript
JavaScript基础语法之js表达式
2016/06/07 Javascript
jquery easyUI中ajax异步校验用户名
2016/08/19 Javascript
jQuery插入节点和移动节点用法示例(insertAfter、insertBefore方法)
2016/09/08 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/10/05 Javascript
JS将unicode码转中文方法
2017/05/08 Javascript
jquery与js实现全选功能的区别
2017/06/11 jQuery
jQuery事件_动力节点Java学院整理
2017/07/05 jQuery
vue实现树形菜单效果
2018/03/19 Javascript
Bootbox将后台JSON数据填充Form表单的实例代码
2018/09/10 Javascript
Vue动态加载异步组件的方法
2018/11/21 Javascript
从0到1构建vueSSR项目之node以及vue-cli3的配置
2019/03/07 Javascript
JQuery中DOM节点的操作与访问方法实例分析
2019/12/23 jQuery
vue+element使用动态加载路由方式实现三级菜单页面显示的操作
2020/08/04 Javascript
[33:19]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第一场 11.26
2020/11/30 DOTA
Python的Urllib库的基本使用教程
2015/04/30 Python
django中间键重定向实例方法
2019/11/10 Python
CSS3实现超慢速移动动画效果非常流畅无卡顿
2014/06/15 HTML / CSS
用canvas实现图片滤镜效果附演示
2013/11/05 HTML / CSS
你对IPv6了解程度
2016/02/09 面试题
汇科协同Java笔试题
2012/03/31 面试题
商务英语专业求职信
2014/06/26 职场文书
2014年人民调解工作总结
2014/12/08 职场文书
《有余数的除法》教学反思
2016/02/22 职场文书
经典法律座右铭(50句)
2019/08/15 职场文书
如何解决php-fpm启动不了问题
2021/11/17 PHP
python区块链持久化和命令行接口实现简版
2022/05/25 Python