Jes*_*ess 3940 javascript security ajax json
为什么Google会while(1);
在其(私人)JSON响应前加上?
例如,这是在Google日历中打开和关闭日历时的响应:
while(1);[['u',[['smsSentFlag','false'],['hideInvitations','false'],
['remindOnRespondedEventsOnly','true'],
['hideInvitations_remindOnRespondedEventsOnly','false_true'],
['Calendar ID stripped for privacy','false'],['smsVerifiedFlag','true']]]]
Run Code Online (Sandbox Code Playgroud)
我认为这是为了防止人们eval()
对它进行操作,但你真正需要做的就是更换while
然后你就可以了.我认为eval预防是为了确保人们编写安全的JSON解析代码.
我已经在其他几个地方看到了这种情况,但谷歌(邮件,日历,通讯录等)的情况更是如此.奇怪的是,谷歌文档开始了&&&START&&&
,谷歌联系人似乎开始while(1); &&&START&&&
.
这里发生了什么?
rjh*_*rjh 4186
它可以防止JSON劫持,这是一个主要的JSON安全问题,自2011年以来在EMCA5中已在所有主流浏览器中正式修复.
举例说明:Google有一个URL mail.google.com/json?action=inbox
,以JSON格式返回收件箱的前50条消息.由于同源策略,其他域上的邪恶网站无法通过AJAX请求获取此数据,但它们可以通过<script>
标记包含URL .使用您的 cookie 访问URL ,通过覆盖全局数组构造函数或访问器方法,只要设置了对象(数组或散列)属性,就可以调用该方法,从而允许它们读取JSON内容.
的while(1);
或&&&BLAH&&&
防止这样的:在一个AJAX请求mail.google.com
将具有完全访问的文本内容,并且可以去除它扔掉.但是<script>
标签插入盲目地执行JavaScript而不进行任何处理,从而导致无限循环或语法错误.
这并未解决跨站点请求伪造的问题.
Arn*_*anc 544
它可以防止通过JSON劫持泄露响应.
理论上,HTTP响应的内容受同源策略的保护:来自一个域的页面无法从另一个域的页面获取任何信息(除非明确允许).
攻击者可以代表您在其他域上请求页面,例如使用<script src=...>
或<img>
标记,但无法获取有关结果的任何信息(标题,内容).
因此,如果您访问攻击者的页面,则无法从gmail.com读取您的电子邮件.
除了使用脚本标记来请求JSON内容之外,JSON在攻击者的受控环境中作为Javascript执行.如果攻击者可以替换Array或Object构造函数或在对象构造期间使用的其他方法,则JSON中的任何内容都将通过攻击者的代码并被披露.
请注意,这在JSON作为Javascript执行时发生,而不是在解析时.
有多种对策:
通过while(1);
在JSON数据之前放置一条语句,Google确保JSON数据永远不会作为Javascript执行.
只有合法的页面才能真正获取整个内容,剥离while(1);
并将剩余部分解析为JSON.
for(;;);
例如,在Facebook上已经看到了类似的结果.
同样,在JSON之前添加无效标记,例如&&&START&&&
,确保它永远不会被执行.
这是防止JSON劫持的OWASP
推荐方法,并且是较少侵入性的方法.
与之前的反措施类似,它确保JSON永远不会作为Javascript执行.
有效的JSON对象(未被任何内容包含)在Javascript中无效:
eval('{"foo":"bar"}')
// SyntaxError: Unexpected token :
Run Code Online (Sandbox Code Playgroud)
但这是有效的JSON:
JSON.parse('{"foo":"bar"}')
// Object {foo: "bar"}
Run Code Online (Sandbox Code Playgroud)
因此,确保始终在响应的顶层返回一个Object,确保JSON不是有效的Javascript,同时仍然是有效的JSON.
正如@hvd在评论中所指出的,空对象{}
是有效的Javascript,并且知道对象是空的可能本身就是有价值的信息.
OWASP方式不那么具有侵入性,因为它不需要更改客户端库,并传输有效的JSON.但是,不确定过去或未来的浏览器错误是否会破坏这一点.正如@oriadam指出,目前还不清楚是否数据可以解析错误通过错误处理或不泄露(如window.onerror).
谷歌的方式需要客户端库,以便它支持自动反序列化,并且可以被认为是更安全的浏览器错误.
这两种方法都需要服务器端更改,以避免开发人员意外发送易受攻击的JSON.
bdo*_*lan 360
这是为了确保其他网站无法做出令人讨厌的技巧来试图窃取您的数据.例如,通过替换数组构造函数,然后通过<script>
标记包含此JSON URL ,恶意第三方网站可能会从JSON响应中窃取数据.通过while(1);
在开始时放置,脚本将挂起.
另一方面,使用XHR和单独的JSON解析器的同站点请求可以轻松忽略while(1);
前缀.
Poi*_*nty 78
它可以防止它被用作简单<script>
标记的目标.(好吧,它并没有阻止它,但它让它变得令人不快.)那样坏人不能只将那个脚本标记放在他们自己的网站中,而是依靠一个活动的会话来获取你的内容.
编辑 - 记下评论(和其他答案).这个问题与颠覆的内置设施有关,特别是Object
与Array
构造函数有关.这些可以被修改,以便在解析时无关紧要的JSON可以触发攻击者代码.
小智 12
由于这是一篇高流量帖子,我希望在这里提供一个对原始问题稍微不确定的答案,从而提供有关 JSON 劫持攻击及其后果的进一步背景信息
顾名思义,JSON 劫持是一种类似于跨站请求伪造的攻击,攻击者可以从将敏感数据作为数组文字返回到 GET 请求的应用程序访问跨域敏感 JSON 数据。返回数组文字的 JSON 调用示例如下所示:
[{"id":"1001","ccnum":"4111111111111111","balance":"2345.15"},
{"id":"1002","ccnum":"5555555555554444","balance":"10345.00"},
{"id":"1003","ccnum":"5105105105105100","balance":"6250.50"}]
Run Code Online (Sandbox Code Playgroud)
这种攻击可以通过 3 个主要步骤来实现:
第 1 步:让经过身份验证的用户访问恶意页面。步骤 2:恶意页面将尝试从用户登录的应用程序访问敏感数据。这可以通过在 HTML 页面中嵌入脚本标签来完成,因为同源策略不适用于脚本标签。
<script src="http://<jsonsite>/json_server.php"></script>
Run Code Online (Sandbox Code Playgroud)
浏览器将发出 GET 请求,json_server.php
并且用户的任何身份验证 cookie 将随该请求一起发送。步骤 3:此时,虽然恶意站点已执行脚本,但它无法访问任何敏感数据。可以通过使用对象原型设置器来访问数据。在下面的代码中,当尝试设置“ ccnum
”属性时,对象原型属性将绑定到定义的函数。
Object.prototype.__defineSetter__('ccnum',function(obj){
secrets =secrets.concat(" ", obj);
});
Run Code Online (Sandbox Code Playgroud)
至此,恶意站点已成功劫持(ccnum)
返回byjson_server.php
JSON的敏感财务数据
需要注意的是,并非所有浏览器都支持该方法;概念验证是在 Firefox 3.x 上完成的。此方法现已被弃用并被替换。useObject.defineProperty
此攻击还有一种变体,应该适用于返回全名 JavaScript(例如pi=3.14159
)而不是 JSON 的所有浏览器大批。
有多种方法可以防止 JSON 劫持:
由于 SCRIPT 标签只能生成 HTTP GET 请求,因此它们只向 POST 请求返回 JSON 对象。
防止 Web 浏览器将 JSON 对象解释为有效的 JavaScript 代码。
通过要求所有 JSON 请求都需要预定义的随机值来实现跨站点请求伪造保护。
正如您所看到的,While(1)
属于最后一个选项。用最简单的术语来说,while(1)
是一个无限循环,将一直运行到显式发出break语句为止。因此,什么将被描述为要应用的密钥的锁(谷歌中断语句)。因此,黑客没有密钥的 JSON 劫持将始终被驳回。唉,如果您使用解析器读取 JSON 块,则 while(1) 循环将被忽略。
所以总而言之,while(1)
循环可以更容易地被可视化为一个简单的break语句密码,谷歌可以用它来控制数据流。
然而,该声明中的关键词是“简单”一词。值得庆幸的是,自 2010 年以来,经过身份验证的无限循环的使用已从基本实践中删除,因为它在隔离时绝对会大幅降低 CPU 使用率(而且互联网已经不再强制执行粗略的“快速修复”)。如今,代码库已经嵌入了预防措施,该系统不再重要或有效。(其中一部分是从 JSON 劫持转向更富有成效的数据农业技术,我目前不会讨论)
归档时间: |
|
查看次数: |
513437 次 |
最近记录: |