详解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 相关文章推荐
如何获取JQUERY AJAX返回的JSON结果集实现代码
Dec 10 Javascript
jquery默认校验规则整理
Mar 24 Javascript
字符串反转_JavaScript
Apr 28 Javascript
jQuery Ajax页面局部加载方法汇总
Jun 02 Javascript
浅谈Vue的基本应用
Dec 27 Javascript
简单的JS控制button颜色随点击更改的实现方法
Apr 17 Javascript
jQuery ajax请求struts action实现异步刷新
Apr 19 jQuery
JavaScript基于面向对象实现的猜拳游戏
Jan 03 Javascript
webpack+react+antd脚手架优化的方法
Apr 02 Javascript
node.js学习笔记之koa框架和简单爬虫练习
Dec 13 Javascript
微信小程序 scroll-view 水平滚动实现过程解析
Oct 12 Javascript
vue实现日历表格(element-ui)
Sep 24 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 日期加减的类,很不错
2009/10/10 PHP
php操作sqlserver关于时间日期读取的小小见解
2009/11/29 PHP
codeigniter显示所有脚本执行时间的方法
2015/03/21 PHP
php中照片旋转 (orientation) 问题的正确处理
2017/02/16 PHP
thinkphp中的多表关联查询的实例详解
2017/10/12 PHP
php自动加载代码实例详解
2021/02/26 PHP
javascript操作cookie的文章(设置,删除cookies)
2010/04/01 Javascript
javascript中onmouse事件在div中失效问题的解决方法
2012/01/09 Javascript
文本框获得焦点和失去焦点的判断代码
2012/03/18 Javascript
浅析IE10兼容性问题(frameset的cols属性)
2014/01/03 Javascript
火狐下input焦点无法重复获取问题的解决方法
2014/06/16 Javascript
js纯数字逐一停止显示效果的实现代码
2016/03/16 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
2016/08/04 Javascript
使用JS代码实现点击按钮下载文件
2016/11/12 Javascript
node.js发送邮件email的方法详解
2017/01/06 Javascript
Angular中$state.go页面跳转并传递参数的方法
2017/05/09 Javascript
使用 Node.js 模拟滑动拼图验证码操作的示例代码
2017/11/02 Javascript
在angular 6中使用 less 的实例代码
2018/05/13 Javascript
解决在vue项目中webpack打包后字体不生效的问题
2018/09/01 Javascript
Windows上node.js的多版本管理工具用法实例分析
2019/11/06 Javascript
JS实现判断移动端PC端功能
2020/02/21 Javascript
vue制作toast组件npm包示例代码
2020/10/29 Javascript
详解vue中在父组件点击按钮触发子组件的事件
2020/11/13 Javascript
Java分治归并排序算法实例详解
2017/12/12 Python
python爬虫爬取淘宝商品信息(selenum+phontomjs)
2018/02/24 Python
python numpy和list查询其中某个数的个数及定位方法
2018/06/27 Python
Python设计模式之抽象工厂模式原理与用法详解
2019/01/15 Python
Python 计算任意两向量之间的夹角方法
2019/07/05 Python
Matplotlib animation模块实现动态图
2021/02/25 Python
CSS3实现多背景模拟动态边框的效果
2016/11/08 HTML / CSS
初级软件工程师面试题 Junior Software Engineer Interview
2015/02/15 面试题
《小草和大树》教学反思
2014/02/16 职场文书
英文求职信写作小建议
2014/02/16 职场文书
办公室主任岗位承诺书
2014/05/29 职场文书
银行服务明星推荐材料
2014/05/29 职场文书
公司行政助理岗位职责
2015/04/11 职场文书