芙姬情感网
您的当前位置:首页明易躲暗箭难防

明易躲暗箭难防

来源:芙姬情感网
 28 Apr 2016 - evi1m0

[+] Author: evi1m0[+] Team: n0tr00t security team [+] From: http://www.n0tr00t.com[+] Create: 2016-04-28

0x01 JSONView 介绍

  • Github: https://github.com/gildas-lormeau/JSONView-for-Chrome

  • ChromeStore: https://chrome.google.com/w…..bnpoihckbnefhakgolnmc?hl=en-US

  • JSONView 插件是目前最热门的一款开发者工具插件,它是查看json数据的神器。通常来讲,json 数据一般没有经过格式化或经过了 unicode 编码,没有缩进,没有换行等,给开发者阅读造成了一定困难。而jsonview 插件可以自动对 json 数据转码,缩进,格式化,直接显示出格式化后的数据,使得开发人员可以更好的阅读信息,本文中出现问题的版本为 Chrome 浏览器下的 JSONView 插件,Firefox 下版本不受影响。

    0x02 正确的处理方式

    我们知道开发人员在使用 JSONP callback 的方式进行跨域请求时,通常会为了方便前端调用 callback 名是可自定义的,例如 function?callback=jQuery14114 ,这时页面将会输出 callback 的参数值到页面中,所以出现了很多 callback 导致的跨站漏洞,解决方案大多由过滤 URL 特殊字符、严格定义 Response 头的 Content-Type:application/json 。

    下面这个例子则为 Bilibili API :

    http://api.bilibili.com/x/favourite/folder?callback=jQu%3Ch1%3E163&jsonp=jsonp&_=14618295783

    我们可以看到由于 Reponse Headers 严格定义了 Content-Type 类型为 json 数据格式,所以尽管我成功注入了未转义标签代码,但仍然不会得到执行(ChromeView-source 模式下如果正常解析后是会有高亮标识的),JSONView 的故事也是从这个时候开始的。

    0x03 Dom XSS Vulnerability

    我们之前谈到过 JSONView 插件能够美化原本乱糟糟的 JSON 数据,就像这样:

    在使用 JSONView 的过程中我发现它把数据提取进行了渲染,也就导致原本不存在的漏洞在这里得以重现!这里有一个前提,网站使用 Content-Type 类型对其的过滤而未过滤特殊字符。所以我们可以看到:

    在之后的源码分析中得知是因为通过 DOM 插入数据,直接写入 script 是不加载资源的,所以我们可以使用很多方法来触发恶意代码:

    1. 2. 3. 4. http://api.bilibili.com/x/favourite/folder?callback=jQu11111%3Cimg/src=%27https://www.gxlcms.com/@%27/onerror=%26%2397%3B%26%23108%3B%26%23101%3B%26%23114%3B%26%23116%3B%26%2340%3B%26%23119%3B%26%23105%3B%26%23110%3B%26%23100%3B%26%23111%3B%26%23119%3B%26%2346%3B%26%23108%3B%26%23111%3B%26%2399%3B%26%2397%3B%26%23116%3B%26%23105%3B%26%23111%3B%26%23110%3B%26%2341%3B%3E7653863566327_14618274439&jsonp=jsonp&_=14618295783

    通过几次变形,我们编写出最终的测试代码以弹出 window.location 地址,就这样原本过滤严谨的接口因为 JSONView 的问题而全面崩塌:

    0x06 修复方案

    使用 /master/WebContent/workerFormatter.js 文件中的 htmlEncode 函数进行过滤:

    function jsonToHTML(json, fnName) { var output = ''; if (fnName) output += '' + htmlEncode(fnName) + '('; output += ''; output += valueToHTML(json); output += ''; if (fnName) output += ')'; return output;}

    0x07 VulnTimeline

  • Find the vulnerability. - 2016/04/28 15:00
  • Because the JSONView plug-in (Chrome platform) has not been updated for a long time, Unable to contact the author to fix the vulnerability. - 2016/04/28 20:15
  • Write the Paper, via https://www.gxlcms.com/@evi1m0. - 2016/04/28 22:32
  • 显示全文