gpt4 book ai didi

javascript - 这个 iframe Buster 脚本看起来安全吗?

转载 作者:行者123 更新时间:2023-11-28 02:26:21 25 4
gpt4 key购买 nike

我们被要求在我们的网站上托管一些 iframe Buster 脚本 - 它们允许从外部域转换到 iframe 中的广告从 iframe 外部扩展到主机页面。我们的托管提供商警告我们要注意这些脚本中的安全漏洞。具体来说,他们说其中一些通过允许从任何 URL 将一段 Javascript 加载到我们的网站中来创建跨站点脚本漏洞。

要实现该脚本,您需要在站点上托管一个 HTML 页面。我正在查看广告提供商 Atlas 的示例。在本例中,URL 类似于 http://domain.com/atlas/atlas_rm.htm 。该页面包含一个脚本标记,其 src 位于外部 URL 处,下面是它包含的 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 的 Angular 来看,它看起来相当安全吗?

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

编辑

如果对其他人有用,我们向提供商提到了这一问题,他们的回应是:

  1. iframe Buster 页面仅在 iframe 中才有效
  2. 仅当 iframe 的域与父页面的域相同时,ftlocal.html 文件中的代码才会起作用 - 因此任何代码都已经可以访问父页面了

最佳答案

JS 脚本在您的页面中创建动态生成的脚本标记。

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

如果你深入了解 scriptURL来自,它似乎是传递给 window.location.search 的参数(查询字符串)。

据我所知,这有效地允许任何脚本通过查询字符串传递到您的页面,使其容易受到 DOM XSS 的攻击,除非它被有效地保护以允许通过页面中的框架名称设置域。我会使用您自己的域进行一些测试,并传递搜索的查询字符串变量(JS 中的字符串文字)。

关于javascript - 这个 iframe Buster 脚本看起来安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14873956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com