JSON 劫持在本文中简要说明。
假设您有一个 Web 服务,它向当前经过身份验证的用户返回信用卡号码列表:
[{"id":"1001","ccnum":"4111111111111111","balance":"2345.15"},
{"id":"1002","ccnum":"5555555555554444","balance":"10345.00"},
{"id":"1003","ccnum":"5105105105105100","balance":"6250.50"}]
以下是攻击的执行方式:
让经过身份验证的用户访问恶意页面。
恶意页面将尝试从用户登录的应用程序访问敏感数据。这可以通过在 HTML 页面中嵌入脚本标签来完成,因为同源策略不适用于脚本标签。<script src="http://<json site>/json_server.php"></script>
. 浏览器将发出 GET 请求,json_server.php
并且用户的任何身份验证 cookie 将与请求一起发送。
此时,虽然恶意站点已执行脚本,但它无权访问任何敏感数据。可以通过使用对象原型设置器来访问数据。在下面的代码中,当尝试设置"ccnum"
属性时,对象原型属性被绑定到定义的函数。
Object.prototype.__defineSetter__('ccnum',function(obj) {
secrets = secrets.concat(" ", obj);
});
至此,恶意网站已经成功劫持了ccnum
返回的敏感财务数据() json_server.php
。
还有其他形式的 JSON 劫持技术不依赖于浏览器对该__defineSetter__
功能的支持。这只是进行攻击的一种方式,但本文中描述的还有许多其他方式,例如Array constructor clobbering
, UTF-7
, ES5 functionality
.
因此,在 ASP.NET 中默认禁用返回 JSON 的 GET 请求。