在了解跨域漏洞之前我们需要了解一下什么是同源策略。
同源策略
同源策略是浏览器最核心也最基本的安全功能,不同的客户端脚本在没有明确的情况下,不能读取对方的Dom、cookie、session、ajax等操作的权限资源。
同源策略是浏览器得行为,是为了保护本地数据不被JavaScript代码获取回来的数据污染,因此拦截得是客户的请求回来的数据接收,即请求发送了,服务器响应了,但是无法被浏览器接收
http://a.baidu.com:80
URL | 结果 | 原因 |
https://a.baidu.com | 不同源 | 不同协议 |
http://b.baidu.com:8081 | 不同源 | 不同端口 |
http://c.basec.com | 不同源 | 不同域名 |
http://a.baidu.com:80 | 同源 |
随着互联网的发展,同源策略越来越严格,目前,对于非同源的网站共有三种行为受到限制。
(1)Cookie、LocalStorage和IndexDB无法获取。
(2)DOM无法获得。
(3)Ajax请求不能发送。
虽然这些限制是必要的,但是有时很不方便,合理的用途也会受到影响,因此需要跨域。
有三个标签可以允许跨域加载资源:<img/>、<link/>、<script>
Access-Control-Allow-Origin
最重要的一组。当网站请求跨域资源时,服务器将返回此标头,并由浏览器添加标头Origin
。Access-Control-Allow-Origin:* a.com 指定哪些域可以访问域资源。例如,如果a.com想要访问b.com的资源,那么开发人员可以使用此标头安全地授予a.com对b.com资源的访问权限。
Access-Control-Allow-Credentials:true 指定浏览器是否将使用请求发送cookie。仅当allow-credentials标头设置为true时,才会发送Cookie。
Access-Control-Allow-Methods:* 指定可以使用哪些HTTP请求方法(GET,PUT,DELETE等)来访问资源。此标头允许开发人员通过在requester.com请求访问provider.com的资源时,指定哪些方法有效来进一步增强安全性
比如后端开发完一部分业务代码后,提供接口给前端用,在前后端分离的模式下,前后端的域名是不一致的,此时就会发生跨域访问的问题。
程序员在本地做开发,本地的文件夹并不是在一个域下面,当一个文件需要发送ajax请求,请求另外一个页面的内容的时候,就会跨域。
子站域名希望调用主站域名的用户资料接口,并将数据显示出来。
电商网站想通过用户浏览器加载第三方快递网站的物流信息。
假设用户登陆一个含有CORS配置网站vuln.com,同时又访问了攻击者提供的一个链接evil.com。
evil.com的网站向vuln.com这个网站发起请求获取敏感数据,浏览器能否接收信息取决于vuln.com的配置。
如果vuln.com配置了Access-Control-Allow-Origin头且为预期,那么允许接收,否则浏览器会因为同源策略而不接收。
A:192.168.100.5
B:192.168.100.11
(A)192.168.100.5
ajax.html 文件内容
(B)192.168.100.11
hello.php中内容
这就将不同源网站上的数据给访问下来了。
正常用户登陆后查看个人信息,这个接口是调用个人信息得,如果这个接口存在了cors跨域漏洞 那么我们是不是可以构造语句,将恶意得网站源码发布到公网 发送给正常用户,当用户点击的时候就会执行这个跨域请求从而获取敏感信息。
如果在hello文件中设置Access-Control-Allow-Origin不为* 那么就指定了,从该域下请求hello文件是允许的,其余会被拦截
我们点击确定 发现浏览器拦截掉了
例如
一个身份信息展示接口,每个用户访问该接口会将其信息展示到页面上,如果该接口将Access-Control-Allow-Origin 设置为 *
那么在不同源下就可以请求到该接口获取对方身份信息。
A服务器上CORS_POC.html文件
当正常用户访问恶意用户构造的链接时(跨域访问,参数传到了img src地址中进行携带参数请求)
看CEYE.IO 发现数据被携带请求。
从而在DNS平台获取100.11中数据
JSONP是JSON的一种使用模式,可以让网页从别的域名获取资料,即跨域读取数据,它利用的是script标签的src属性不受同源策略的特性,jsonp劫持就是攻击者获取了本应该传给网站其他接口的数据
原理:JSONP实现跨域请求的原理简单的说,就是动态创建<script>标签,然后利用<script>的src 不受同源策略约束来跨域获取数据。
通过JSONP技术可以实现数据的跨域访问,必然会产生安全问题,如果网站B对网站A的JSONP请求没有进行安全检查直接返回数据,则网站B便存在JSONP漏洞,网站A利用JSONP漏洞能够获取用户在网站B上的数据。
<html>
<head>
<title>test</title>
<meta charset="utf-8">
<script type="text/javascript">
function JSONP(obj){
alert('user: '+obj["username"]+' pwd: '+obj["password"]);
}
</script>
</head>
<body>
<script type="text/javascript" src="http://192.168.100.11/callback.php?callback=JSONP"></script>
</body>
</html>
<!-- 192.168.100.11/callback.php -->
<?php
header('Content-type: application/json');
$callback = $_GET["callback"];
//json数据
$json_data = '{"username":"admin","password":"admin888"}';
//输出jsonp格式的数据
echo $callback . "(" . $json_data . ")";
?>
JSONP是一种敏感信息泄露的漏洞,攻击者通过巧妙设计一个网站,网站中包含其他网站的JSONP漏洞利用代码,将链接通过邮件等形式推送给受害人,如果受害者点击了链接,则攻击者便可以获取受害者的个人的信息,如邮箱、姓名、手机等信息。