2013-02-14 145 views
1

我們被要求在我們的網站上託管一些iframe腳本腳本 - 它們允許從外部域提供到iframe的廣告在其外部擴展到主頁面。我們的託管服務提供商警告我們要留意這些腳本中的安全漏洞。具體來說,他們說,其中一些人通過允許一段JavaScript從任何URL加載到我們的網站中而創建了跨站點腳本漏洞。這個iframe腳本腳本看起來安全嗎?

要實施該腳本,您需要在您的網站上託管一個HTML頁面。我正在查看來自廣告提供商Atlas的示例。在這種情況下,URL就像http://domain.com/atlas/atlas_rm.htm。該網頁包含在外部網址與SRC的腳本標籤,這裏是它包括JS:

var ARMIfbLib = function() { 

    function documentWrite(htmlString) { 
     document.write(htmlString); 
    } 

    function writeIframeBustingScript() { 
     var imgSrvPath = getTlDirectoryFromQueryString(getParameterString()); 
     if (imgSrvPath != "") { 
      var scriptURL = imgSrvPath + getScriptFileName(); 
      ARMIfbLib.DocumentWrite("<script language='javascript' type='text/javascript' src='" + scriptURL + "'></scr" + "ipt>"); 
     } 
    } 

    return { 
     WriteIframeBustingScript: writeIframeBustingScript, 
     DocumentWrite: documentWrite 
    } 

}(); 

function getValueFromDelimitedString(paramKey, delimiter, queryString) { 
    if (paramKey == "imgSrv") 
     return getValueFromProperties(); 

    var re = new RegExp(paramKey + "=" + "(.*?)" + "(" + delimiter + "|$)"); 
    var matchArray = queryString.match(re); 
    if (matchArray == null) 
     return ""; 
    else 
     return matchArray[1]; 
} 

function getValueFromProperties() { 
    var iframename = unescape(self.name); 
    if (iframename.indexOf("<form") >= 0) { 
     var params = iframename.split("<input "); 
     for (var i = 1; i < params.length; i++) { 
      var parts = params[i].split(" "); 
      for (var j = 0; j < parts.length; j++) { 
       var param = parts[j].split("="); 
       if (param[0].indexOf("name") >= 0 && param[1].indexOf("TL_files_path") >= 0) { 
        param = parts[j + 1].split("="); 
        if (param[0].indexOf("value") >= 0) { 
         var value = param[1].substr(1, param[1].indexOf(">")); 
         value = value.substr(value, value.lastIndexOf("/")); 
         value = value.substr(value, value.lastIndexOf("/") + 1); 
         return unescape(value); 
        } 
       } 
      } 
     } 
    } 
    else if (iframename.indexOf("adparamdelim") >= 0) { 
     var params = iframename.split("adparamdelim"); 
     for (var i = 0; i < params.length; i++) { 
      var param = params[i].split("="); 
      if (param[0].indexOf("TL_files_path") >= 0) { 
       var value = param[1]; 
       value = value.substr(value, value.lastIndexOf("/")); 
       value = value.substr(value, value.lastIndexOf("/") + 1); 
       return value; 
      } 
     } 
    } 
    else if (/^\{.*\}$/.test(iframename)) { 
     try { 
      eval('var results = ' + iframename); 
      var value = results.TL_files_path; 
      value = value.substr(value, value.lastIndexOf("/")); 
      value = value.substr(value, value.lastIndexOf("/") + 1); 
      return value; 
     } catch (e) { 
      return ""; 
     } 
    } else { 
     var params = iframename.split("&"); 
     for (var i = 0; i < params.length; i++) { 
      var param = params[i].split("="); 
      if (param[0].indexOf("TL_files_path") >= 0) { 
       var value = unescape(param[1]); 
       value = value.substr(value, value.lastIndexOf("/")); 
       value = value.substr(value, value.lastIndexOf("/") + 1); 
       return value; 
      } 
     } 
    } 
    return ""; 
} 

function getTlDirectoryFromQueryString(sLocation) { 
    var queryVar = getValueFromDelimitedString("imgSrv", "a4edelim", sLocation); 
    var temp = queryVar.substr(0, queryVar.lastIndexOf("/")); 
    var tlDir = temp.substr(0, temp.lastIndexOf("/") + 1); 
    return tlDir; 
} 

function getDocumentQueryString() { 
    return window.location.search; 
} 

function getIframeParameterString() { 
    var ret = ""; 
    var qs = getDocumentQueryString(); 
    if (qs.length > 0) 
     ret = qs.substring(1); 
    return ret; 
} 

function getScriptParameterString() { 
    var ret = ""; 
    var scripts = document.getElementsByTagName('script'); 
    for (var i = 0; i < scripts.length; i++) { 
     var scriptSrc = scripts[i].src; 
     if (scriptSrc.toLowerCase().indexOf("newiframescript") != -1 && scriptSrc.indexOf("?") != -1) { 
      ret = scriptSrc.substr(scriptSrc.indexOf("?") + 1); 
      break; 
     } 
    } 
    return ret; 
} 

function getParameterString() { 
    var qs = getIframeParameterString(); 
    if (qs.length > 0 && qs.indexOf("a4edelim") > 0) 
     return qs; 
    return getScriptParameterString(); 
} 

function getScriptFileName() { 
    var armdelim = ","; 
    var fileName = "ifb.0"; 
    var queryString = getParameterString(); 
    var parmValue = ""; 
    if (queryString.length > 0) { 
     parmValue = getValueFromDelimitedString("armver", "a4edelim", queryString); 
    } 
    if (parmValue.length > 0) { 
     var fileNames = parmValue.split(armdelim); 
     for (var i = 0; i < fileNames.length; i++) { 
      if (fileNames[i].toLowerCase().indexOf("ifb") != -1) { 
       fileName = fileNames[i]; 
       break; 
      } 
     } 
    } 
    return fileName + ".js"; 
} 

if (typeof(armTestMode) == "undefined") { 
    ARMIfbLib.WriteIframeBustingScript(); 
} 

我已經花了幾個小時研究這個,試圖找出它做什麼,但我陷入了不同的函數調用中。它似乎在抓取一個查詢字符串參數,或者是一個來自iframe名稱的值,可能是包含該廣告的iframe。

任何人都可以理解這個JS在做什麼?從XSS的角度看它是否相當安全?

=========================================

編輯

萬一到別人有用,我們提到這個問題的供應商,他們的反應是:如果是在iframe

  • 的代碼在

    1. iframe阻止頁面只會工作ftlocal.html文件只有在iframe的域名與父頁面的域名相同的情況下才有效 - 所以任何代碼都會被讀取y無論如何都可以訪問父頁面
  • +0

    如果您包含來自外部域的JavaScirpt引用,那麼您的頁面就是腳本的奇想。你實際上允許你的頁面信任外部域,所以腳本可以通過DOM操縱你的任何內容。 – SilverlightFox 2013-02-15 09:40:50

    +0

    謝謝SilverlightFox,我知道你必須信任提供商 - 我更關心惡意的第三方。 – 2013-02-15 13:58:44

    回答

    1

    JS腳本在頁面中創建一個動態生成的腳本標記。

    ARMIfbLib.DocumentWrite("<script language='javascript' type='text/javascript' src='" + scriptURL + "'></scr" + "ipt>");

    如果你深入到哪裏scriptURL從何而來,這似乎是一個參數傳遞給window.location.search(查詢字符串)。

    從我能看到的這種有效性允許任何腳本傳遞到查詢字符串上的頁面,使其容易受到DOM XSS的影響,除非它有效地保護了域名,使其能夠被頁面中的框架名稱設置。我會做一些測試,使用您自己的域名並傳遞查找的查詢字符串變量(JS中的字符串文字)。

    +0

    感謝SilverlightFox,這證實了我對這個腳本的印象。 – 2013-02-16 17:08:59