我使用广泛的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'&&!_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攻击吗?
** 更新 **
看来我并不是唯一一个在他们的网站上发现过这种异常现象的人。我找到了this report of the same exact behavior,这似乎表明代码是无害的,但仍无法解答它来自哪里。
此外,我发现this pastebin with similar code,似乎是某种广告脚本。再次,并非非常有帮助。
** 更新2 **
更多上下文:webapp使用多个第三方jQuery插件,但没有任何第三方分析。所有脚本都托管在我们自己的服务器上,对我们所有代码的审核都不会为“cloudfront”提供匹配。
此应用程序已投入生产约4年,这是此类活动的第一个也是唯一一个实例。它之前或之后都没有发生过,所以我怀疑我能否重现它。
我感兴趣的是这是否是某种攻击。如果是的话,我想知道如果它已经没有堵塞的话,如何堵塞它试图利用的漏洞。
答案 0 :(得分:32)
免责声明:我不是安全分析师/专家,您的问题只是引起了我的兴趣;)
警告:虽然我分享了代码本身可能无害的初步结论,但基础技术肯定也可以(ab)用于恶意意图,所以在调查时请小心自己。
你已经自己找到了相关的证据 - 进一步搜索我找到了另一个pastebin drop,它更具可读性,所以我用它来解释(虽然乍一看另一个会允许这样做格式化后很好。)
该代码段包含具有以下主要功能的JavaScript片段:
第13行使用各种项目初始化变量_GPL
以供日后使用,例如:各种常量,辅助函数,浏览器兼容性和实际有效负载,例如:
第20行定义了一个空basdeCDN
,第21行定义了一个fCDN
,恰好是有问题的一个( d15gt9gwxw5wu0.cloudfront.net )
第261行定义了一个函数removeScripts(),
,它又使用第266行的findScript()
,在第277行进一步伴随insertJS()
- 它们各自的意图是显而易见的
第270行定义了函数loadDomainRules()
,它似乎是生成您在日志中找到的URL的函数 - 请参阅下面的附录以获取代码段
r.js
是一个JavaScript文件,提供为手头的域专门组装/生成的自定义JavaScript > 第100行定义了一个函数loadGeo()
,它确实引用了某种广告服务器( ads2srv.com ) - 请参阅下面的附录以获取代码段
第368行最后定义了一个函数i()
,它提供了关于所有这些的可能来源的最明确的线索,即一些 Yontoo Client的概念< / em>和 Yontoo API - 请参阅下面的附录以获取代码段
提取的线索 Yontoo客户端和 Yontoo API 可轻松导致Yontoo,一个应用程序平台,可让您控制每天访问的网站,即它听起来像Userscripts.org的商业化版本,请参阅What is a Yontoo App?:
Yontoo是一个自定义的浏览器插件 增强基础网站
我可以在哪里使用它?
Yontoo可以在网络上的任何网站上工作,但 功能来自名为Yontoo Apps的独立应用程序 根据您所在的位置提供特定功能 上即可。
[强调我的]
现在,查看他们App Market中的当前列表很容易演示,为什么这可能用于可疑不透明广告,例如,他们的页脚中的所有信任标志和印章尽管
另一个引用提供了对功能的更深入了解以及它如何产生您遇到的问题:
Yontoo [...]是一个 浏览器插件,用于创建可编辑的虚拟图层 创建对底层进行更改的外观 网站。 [...] 如果您在网站上看到需要申请或工具,那么您 可自由创造!
所以有人显然已经访问过您的网站,并通过Yontoo客户端(如果它实际上允许最终用户使用)或available apps(用于分析参考的代码段)之一为其创建了一些自定义域规则例如,第379行中的下拉交易应用程序,触发创建d15gt9gwxw5wu0.cloudfront.net/js/_MY_WEB_APP_DOMAIN_/r.js
以存储这些规则,以便在下次网站访问时重复使用。
由于某些安全漏洞(请参阅下面的结论),此URL或相应的JavaScript代码段必须已注入应用程序的JavaScript代码中(例如,确实通过Cross-site scripting (XSS)),并触发了日志条目错误在某个时刻反过来。
如前所述,我分享了初步的结论,即代码本身可能是无害的,尽管底层技术肯定会被(ab)用于恶意意图,因为它本身就是用客户端JavaScript进行模拟,即,用户允许来自第三方服务的代码与他每天使用和信任的网站(尤其是数据)进行交互 - 您的情况就是在这方面出现问题的明显证据。
我还没有调查过Yontoo的安全架构(如果有的话),但是也无法立即在他们的网站上找到关于这个重要主题的任何信息(例如在Support部分),这对于像这样的恕我直言的技术来说是非常不可接受的,尽管它们的页脚都有信任标志和印章。
另一方面,用户确实安装了第三方脚本。 Userscripts.org当然是fine tuning the user experience on Stack Exchange,对{{3}}来说也是如此;)
请相应地做出自己的判断!
您可以在下面找到分析中引用的代码段(我已经无法在列表中内联它们而不会破坏布局或语法突出显示):
loadDomainRules()
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
}
loadGeo()
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()
}
}
<强> I() 强>
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'])
}
答案 1 :(得分:0)
我在drupal 7网站上找到了一个iFrame。通过启用sharaholic模块将其加载到站点中。