跨站读取数据小结

   2016-12-01 0
核心提示:注:本文为“小米安全中心”原创,转载请联系“小米安全中心”上期回顾:search-guard 在 Elasticsearch 2.3 上的运用本文主要介绍几种跨域获取数据的方法,比较基础,但是在跨站漏洞的挖掘和利用上会起到很大的帮助。下面根据个例子简单的把遇到的跨域总结下

注:本文为“小米安全中心”原创,转载请联系“小米安全中心”

上期回顾: search-guard 在 Elasticsearch 2.3 上的运用

本文主要介绍几种跨域获取数据的方法,比较基础,但是在跨站漏洞的挖掘和利用上会起到很大的帮助。下面根据个例子简单的把遇到的跨域总结下:

场景: 网站A获取网站B上的资源,需要跨域传输数据

两种情况:

跨站读取数据小结 测试环境:

我们这里设置简单点,为了下面的说明,统一设置到test.com域下,只是二级域名不相同。只要不设置document.domain,这样也不算是同域

hosts设置:

ip a.test.com

ip b.test.com

测试需求:

利用a站获取到b站的资源,首先看下同源策略是怎样保证请求数据的安全的。

首先采用直接使用iframe加载,直接使用js来获取数据。

B站点要获取的data文件内容:

跨站读取数据小结

A站点获取数据html代码:

跨站读取数据小结 在chrome下访问A站的getB.html,出现

Uncaught SecurityError: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin " " from accessing a frame with origin " ". Protocols, domains, and ports must match .

同源策略直接进行了阻止,防止进行跨域操作。

很多时候会采用ajax去获取访问数据, 下面是获取数据代码:

跨站读取数据小结

访问,看chrome下面的提示:

XMLHttpRequest cannot load  http://b.test.com/data.html . No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' ' is therefore not allowed access.

下面分两种情况实现跨域获取数据:

一、B站的资源是可控的

1.通过document.domain来控制

同主域名下iframe控制document.domain进行读取,修改data.html和getB.html内容增加域的设置:

document.domain=”test.com”

再次访问,成功获取到数据信息,这个是最简单的,大域是相同的,都是可以去利用的。其实所有的com网站,cn网站都是一个大域,不过现在浏览器拒绝了这样的请求

2.iframe结合location.hash进行跨域数据获取

B站下data文件:

跨站读取数据小结

跨站读取数据小结

主要是B站的data文件iframe加载proxy,hash获取到data数据,传递给proxy.html的hash中,proxy获取到hash传递给同源的A站

getB_byhash.html

跨站读取数据小结

主要是利用A站获取数据文件iframe加载B站的data文件,data文件又加载A站的proxy文件,proxy的hash中存有B站的数据,proxy和get文件同源,利用parent.parent两个父页面传递出hash

3.通过iframe.name跨域传递数据

B站的data文件为:

跨站读取数据小结

A站getB_byname.html的内容:

跨站读取数据小结
代码可以变得更简单点:

跨站读取数据小结 原理:

主要就是先iframe 加载数据页面,此时window.name传递给了iframe的name,在利用跳转到同源的页面下,输出数据。

4.json劫持

B站的data数据:

A站的get代码:

跨站读取数据小结

5.html5中的postMessage

B站的data数据:

跨站读取数据小结

获取数据代码:

跨站读取数据小结 这个可以参考下 呆子不开口的《对方不想说话并扔了个message》

6.CORS

主要就是通过设置相应头中的 Access-Control-Allow-Origin 字段。前面直接用ajax获取数据时候已经提示了。

Access-Control-Allow-Origin 响应字段说明了该资源或网站所允许被非同源站点访问的站点列表,当 Access-Control-Allow-Origin 中包含网站 A 或者设置为 * 时,网站 A 即可对网站 B 上的资源进行任意访问。

也就是利用ajax请求可以获取到数据信息的。

php文件:

跨站读取数据小结

设置 Access-Control-Allow-Origin 允许所有站点访问读取

get代码:

跨站读取数据小结

二、B站资源不可控

利用中间代理访问,方法利用php页面去访问数据页面获取到数据,在利用cors传递回来。

代理代码:

跨站读取数据小结

A站直接ajax请求proxy即可

跨站读取数据小结

注:本文为“小米安全中心”原创,转载请联系“小米安全中心”

有奖问答

问题:

  1. 你还有那些跨域获取数据的方法?

  2. 这里面代码里面存在哪几个漏洞设置?

  3. 讨论下same攻击

首先php代码是有缺陷的,不去设置过多,最简单的,页面内容不可控:

地址为:www.same.com/1.php

跨站读取数据小结

这里有个html页面,里面就是个点击的按钮,页面内容不可控:

地址为www.same.com/1.html

怎么实现自己写个站点页面(不能和same同域),让其他人访问这个页面后出现点击事件?

分别考虑下:php限制了referer和不限制referer的情况。

(本次有奖问答,截止至12月4日18:00,点击“写留言”,留下你宝贵的思路。如果留言,被作者选中,我们会送上礼物,作为奖励哦)

跨站读取数据小结

↓↓↓往期回顾,请点击"阅读原文", 登录技术分享版块

 
标签: Ajax PHP
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • EXT调用ASP.NET AJAX WebService
    Posted 周五, 04/11/2008 - 16:34 by admin 在asp.net ajax中,使客户端调用WebService变得非常的简单,而且非常有用(个人觉得这个功能是asp.net ajax的核心,很多与客户端的交互都需要这个功能来辅助实现)。那在EXT中,标准的客户端与服务器端交互,使用的
    02-09
  • ajax传数组后台GO语言接收
    js代码如下:function PostHandle(url,data,callback) {$.ajax({type: "Post",url:url,data:data,dataType:'json',async: false,success: callback});}var arr = new Array(); //arr是你想要传递的数组,自己定义即可 PostHandle("/getOriginalGrade",{ "arr&q
    02-09
  • ajax 报0错误 PHP Ajax 跨
    本以为在本地测试不会跨越,结果检查下来就是跨域的问题!!!!来源:https://www.cnblogs.com/xiezn/p/5651093.html 本文通过设置Access-Control-Allow-Origin来实现跨域。例如:客户端的域名是client.runoob.com,而请求的域名是server.runoob.com。如果
    02-09
  • PHP解决ajax跨域的问题 ajax跨域的解决办法
    跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。同源策略:同源策略/SOP(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS
    02-09
  • asp.net 2.0 ajax中使用PopupControlExtender
     最近在著名的4guysfromrolla.com(http://www.4guysfromrolla.com)上,有篇不错的文章(http://aspnet.4guysfromrolla.com/articles/070407-1.aspx),讲的是如何使用aspajx中的controltookit中的PopupControlExtender控件来实现一些特殊的效果,比如文中举了
    02-09
  • 在asp.net中使用ajaxpro与一般页面的区别
    1.一般页面:Server.UrlEncode,Ajaxpro:HttpUtility.UrlEncode一般页面:Server.UrlDecode,Ajaxpro:HttpUtility.UrlDecode2.Server.MapPath的使用Ajaxpro:最好是从网站根目录来取 一般页面:  string strPath = Server.MapPath("../xslt/trans.xslt");-
    02-09
  • Asp.net Ajax的start和web.config配置
    微软于2006年11月9日发布了ASP.NET AJAX 1.0 Beta 2 从最初的 Atlas 到 ASP.NET AJAX 1.0 Beta 1 再到 Beta 2 ,这一个基于.NET 的 AJAX 框架已经趋于完整,越来越多的.NET开发者也开始使用这套框架所提供的强大功能建立自己的AJAX应用,在从使用Atlas到AS
    02-09
  • asp.net ajax get 调用(和post不一样,直接返回
    script type="text/javascript" $(document).ready(function () {$('#Label1').click(function () {$.ajax({type: 'GET',url: 'djb.aspx?sfzh=' + '3720510',dataType: 'json',success: function (data) { //不需
    02-09
  • ajaxFileUpload + lua-resty-upload 上传文件
    ajaxFileUpload下载地址地址:http://pan.baidu.com/s/1mgJypz6html页面!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"htmlheadmeta http-equiv="Content-Type" content="text/html; charset=UTF-8"/titleUntitled/titlescript src=&qu
    02-08
  • ajax调用php失败如何解决 ajax请求失败处理方式
    这篇文章主要讲解了“ajax调用php失败如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ajax调用php失败如何解决”吧!ajax调用php失败是因为ajax只能发起GET请求,而不能发POST请求,否则报500错
    02-08 ajaxphp
点击排行