声明:本篇文章仅用于自己的学习交流,笔记记录以及感悟记载,不得用于其他用途。
(图片来源于百度百科。)
一、同源策略
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
直接访问url , 先不要管这个url对应的参数是怎么知道的
http://192.168.23.130/user.php?callback=jsonp2
根据url参数 , 以及返回的有敏感信息 , 猜想可能存在jsonp劫持漏洞 , 构建 poc
poc模板
实战中只需要修改src对应的值 , 并把该文件放在vps上即可
SRC挖掘中只有返回了敏感信息的jsonp劫持才能算是有危害
jsonp.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
1.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)防御方案
- json 正确的 http 头输出尽量避免跨域的数据传输,对于同域的数据传输使用 xmlhttp 的方式作为数 据获取的方式,依赖于 javascript 在浏览器域里的安全性保护数据,如果是跨域的数据传输,必须要对敏 感的数据获取做权限认证;
- 严格安全的实现 CSRF 方式调用 JSON 文件:限制 Referer 、部署一次性 Token 等;
- 严格安装 JSON 格式标准输出 Content-Type 及编码( Content-Type : application/json; charset=utf-8 );
- 严格过滤 callback 函数名及 JSON 里数据的输出;
- 严格限制对 JSONP 输出 callback 函数名的长度(如防御上面 flash 输出的方法);
- 其他一些比较“猥琐”的方法:如在 Callback 输出之前加入其他字符(如:/**/、回车换行)这样不影响 JSON 文件加载,又能一定程度预防其他文件格式的输出。还比如 Gmail 早起使用 AJAX 的方式获取 JSON ,听过在输出 JSON 之前加入 while(1) ;这样的代码来防止 JS 远程调用。