Javascript 为什么Cloudfront在我的web应用程序中加载脚本?(我不使用它)
我通过广泛使用jQuery管理一个安全的PHP/MySQL web应用程序。今天,我们的应用程序日志中出现了一个奇怪的错误:Javascript 为什么Cloudfront在我的web应用程序中加载脚本?(我不使用它),javascript,security,web-applications,xss,amazon-cloudfront,Javascript,Security,Web Applications,Xss,Amazon Cloudfront,我通过广泛使用jQuery管理一个安全的PHP/MySQL web应用程序。今天,我们的应用程序日志中出现了一个奇怪的错误: JS Error: Error loading script: https://d15gt9gwxw5wu0.cloudfront.net/js/_MY_WEB_APP_DOMAIN_/r.js 我们的应用程序中没有使用亚马逊的Cloudfront CDN。当我转到加载失败的URL时,只有以下内容: if(typeof _GPL.ri=='function'&&
JS Error: Error loading script:
https://d15gt9gwxw5wu0.cloudfront.net/js/_MY_WEB_APP_DOMAIN_/r.js
我们的应用程序中没有使用亚马逊的Cloudfront CDN。当我转到加载失败的URL时,只有以下内容:
if(typeof _GPL.ri=='function'&&!_GPL.isIE6){_GPL.ri('_GPL_r')}_GPL.rl=true;
用户的用户代理字符串为:
Mozilla/5.0 (Windows NT 6.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
请注意:我不是触发此错误的用户。是我们成千上万的用户触发了它。我无法控制客户端计算机
有人知道这里发生了什么吗?这是某种XSS攻击吗
**更新**
看来我不是唯一一个在他们的网站上发现这种异常现象的人。我发现,这似乎表明代码是无害的,但仍然没有答案,因为它来自哪里
此外,我发现,这似乎是某种广告脚本。再说一次,没什么帮助
**更新2**
更多内容:webapp使用了几个第三方jQuery插件,但没有任何第三方分析。所有脚本都托管在我们自己的服务器上,对我们所有代码的审核不会提供与“cloudfront”匹配的内容
该应用程序已投入生产约4年,这是此类活动的第一个也是唯一一个实例。这之前或之后都没有发生过,所以我怀疑我是否能够重现它
我感兴趣的是这是否是某种攻击。如果是,我想知道如果它还没有被堵住,如何堵住它试图利用的漏洞。免责声明:我不是安全分析师/专家,你的问题只是激发了我的兴趣;) 警告:虽然我同意代码本身可能无害的初步结论,但基本技术也很可能被(ab)用于恶意目的,因此请您自己调查时小心 分析 你自己已经找到了相关的证据——进一步搜索,我发现了另一个更具可读性的证据,所以我用它来解释(虽然乍一看,另一个在格式化后也会允许这样做) 该代码段的JavaScript片段具有以下主要功能:
- 第13行初始化变量
,使用各种类型的项目供以后使用,例如各种常量、帮助函数、浏览器兼容性材料和实际有效载荷,例如:\u GPL
- 第20行定义了一个空的
,第21行定义了一个basdeCDN
,这恰好是有问题的一个(d15gt9gwxw5wu0.cloudfront.net)fCDN
- 第261行定义了一个函数
,该函数依次使用第266行的removescript(),
,第277行的findScript()
insertJS()
- 第270行定义了函数
,它似乎是生成您在日志中找到的URL的函数-代码片段见下面的附录loadDomainRules()
- 推论:即使没有下面收集的进一步证据,命名和功能也强烈暗示
是一个JavaScript文件,提供专门为手头域组装/生成的自定义JavaScriptr.js
- 推论:即使没有下面收集的进一步证据,命名和功能也强烈暗示
- 第100行定义了一个函数
,它确实引用了某种ad服务器(ads2srv.com)——代码片段见下面的附录loadGeo()
- 第368行最后定义了一个函数
,该函数提供了关于所有这一切可能起源的最明确的线索,即一些Yontoo客户端和Yontoo API的概念-代码片段见下面的附录i()
- 第20行定义了一个空的
d15gt9gwxw5wu0.cloudfront.net/js/_MY_WEB_APP_DOMAIN_/r.js
来存储这些规则,以便在下次访问网站时再次使用
由于某个地方存在某些安全缺陷(请参见下面的结论),此URL或相应的JavaScript片段必须已被注入到应用程序的JavaScript代码中(例如,通过“确实”),并在某个点依次触发日志输入错误
结论
正如前面已经提到的,我同意最初的结论,即代码本身可能是无害的,尽管底层技术很可能(ab)用于mal
function () {
if (location.host != "") {
var a = location.host.replace(RegExp(/^www\./i), "");
this.insertJS(this.proto + this.fCDN + "/js/" + a + "/r.js")
}
this.loaded_domain_rules = true
}
function () {
var cid = this.items.e6a00.get("geo.cid");
var updatetime = this.items.e6a00.get("geo.updatetime");
if (!cid || (cid && updatetime && (Math.floor((new Date()).getTime() / 1000) - parseInt(updatetime)) >= 259200)) {
this.insertJS(((this.proto == 'https://') ? 'https://s.' : 'http://') + 'ads2srv.com/tb/gc.php?json&cb=_GPL.setGeoAndGo')
} else {
this.vars.cid = this.items.e6a00.get("geo.cid");
this.vars.rid = this.items.e6a00.get("geo.rid");
this.vars.ccid = this.items.e6a00.get("geo.ccid");
this.vars.ip = this.items.e6a00.get("geo.ip");
this.loadCC();
this.loadDomainRules()
}
}
function () {
if (typeof YontooClient != 'undefined') YontooClient = {};
if (typeof yontooAPI != 'undefined') yontooAPI = {};
if (typeof DealPlyConfig != 'undefined') {
DealPlyConfig.getBaseUrl = function () {
return "https://d3lvr7yuk4uaui.cloudfront.net/items/blank.js?"
};
DealPlyConfig.getCrownUrl = function () {
return "https://d3lvr7yuk4uaui.cloudfront.net/items/blank.js?"
}
}
this.rm(this.ri, ['dropdowndeals', 'Y2LeftFixedCurtain', 'gbdho', 'bdca', 'dealply-toast-1', 'pricegong_offers_iframe', 'SF_VISUAL_SEARCH', 'batAdRight', 'batAdBottom', 'batAdMiddle_0', 'batAdMiddleExt1_0', 'batAdRight2', 'invisiblehand-iframe', 'scTopOfPageRefinementLinks', 'sf_coupon_obj']);
this.rm(this.rc, ['yontoolayerwidget', 'dealply-toast', 'imb-ad']);
this.rm(this.ric, [
['productbox', 'g'],
['related-searches', 'related-searches-bing']
]);
this.rm(this.rtn, ['MIVA_AdLink', 'itxtrst', 'kLink', 'FAAdLink', 'IL_AD', 'skimwords-link'])
}