详解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 相关文章推荐
用于table内容排序
Jul 21 Javascript
js复制到剪切板的实例方法
Jun 28 Javascript
jQuery的:parent选择器定义和用法
Jul 01 Javascript
jquery mobile页面跳转后样式丢失js失效的解决方法
Sep 06 Javascript
javascript中call apply 与 bind方法详解
Mar 10 Javascript
javascript显示系统当前时间代码
Dec 29 Javascript
常用的几个JQuery代码片段
Mar 13 Javascript
js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
Sep 19 Javascript
Vue组件中slot的用法
Jan 30 Javascript
webpack之引入图片的实现及问题
Oct 08 Javascript
浅析TypeScript 命名空间
Mar 19 Javascript
vue滑动吸顶及锚点定位的示例代码
May 10 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程序员面试 切忌急功近利(更需要注重以后的发展)
2010/09/01 PHP
php数组函数序列之array_splice() - 在数组任意位置插入元素
2011/11/07 PHP
php防止sql注入示例分析和几种常见攻击正则表达式
2014/01/12 PHP
php判断访问IP的方法
2015/06/19 PHP
php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
2015/07/29 PHP
php微信开发之上传临时素材
2016/06/24 PHP
基于PHPexecl类生成复杂的报表表头示例
2016/10/14 PHP
javascript之解决IE下不渲染的bug
2007/06/29 Javascript
offsetParent 算法分析
2010/04/05 Javascript
js bind 函数 使用闭包保存执行上下文
2011/12/26 Javascript
基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)
2012/07/31 Javascript
前端轻量级MVC框架CanJS详解
2014/09/26 Javascript
JQuery 使用attr方法实现下拉列表选中
2014/10/13 Javascript
vue货币过滤器的实现方法
2017/04/01 Javascript
微信小程序使用form表单获取输入框数据的实例代码
2018/05/17 Javascript
vue + axios get下载文件功能
2019/09/25 Javascript
jQuery实现tab栏切换效果
2020/12/22 jQuery
[01:02:06]LGD vs Mineski Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
[46:42]DOTA2-DPC中国联赛正赛 Aster vs Magma BO3 第二场 3月5日
2021/03/11 DOTA
Python模拟登录的多种方法(四种)
2018/06/01 Python
python实现简单的单变量线性回归方法
2018/11/08 Python
selenium+python自动化测试之鼠标和键盘事件
2019/01/23 Python
树莓派采用socket方式文件传输(python)
2019/06/22 Python
浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法
2019/10/25 Python
Python turtle库绘制菱形的3种方式小结
2019/11/23 Python
PyCharm使用Docker镜像搭建Python开发环境
2019/12/26 Python
Python运行DLL文件的方法
2020/01/17 Python
解决Tensorboard 不显示计算图graph的问题
2020/02/15 Python
让Django的BooleanField支持字符串形式的输入方式
2020/05/20 Python
微软中国官方商城:Microsoft Store中国
2018/10/12 全球购物
香港艺人陈冠希创办的潮流品牌:JUICESTORE
2021/03/04 全球购物
教师先进事迹材料
2014/12/16 职场文书
《田忌赛马》教学反思
2016/02/19 职场文书
大学生创业计划书常用模板
2019/08/07 职场文书
python实现简易名片管理系统
2021/04/11 Python
MySQL 使用自定义变量进行查询优化
2021/05/14 MySQL