原文:《Cross-Site Scripting #3 Bad JavaScript Imports》
译者:Twosecurity

在这篇文章里,我们将换一个姿势利用 XSS。通常来讲,XSS 是由程序对输入缺乏合理的过滤而产生的。但在这篇文章里,我会展示如何在正确过滤 XSS 的网站中利用 XSS。它和常规攻击手段类似,我们也可以用它来偷 cookie 或者钓鱼。不过在之前,我们先来讲解一下跨域资源共享技术。

跨域资源共享

跨域资源能够提供浏览器更好的用户体验。通过它,我们可以在一个网站上访问到不属于它域下的资源(比如图像,javascript,以及其它数据)。打个比方:

http://example.com 有如下跨域资源:

为什么要引用脚本,而不是直接内联?

当许多网站同时引用<script src=”https://code.jquery.com/jquery-1.8.1.min.js”></script>时,浏览器只需加载一次,便可以将其载入缓存方便不同网站对其的调用。

为什么我们又需要加载外部的javascript库呢?答案很简单,方便开发。在 jQuery 中,我们只需短短的一句,就可以改变背景颜色:$(‘body’).css('background', '#ccc');

如果直接用原生 JavaScript 操作 DOM 的话,我们就得:

Function changeBachground(color) {
  Document.body.style.background = color;
}

Onload="changeBackground('red');" //某个事件

由 javascript 引用而导致的漏洞

由于控制权的缺失,加载第三方控制的脚本有十分严重的安全隐患。第三方网站的站长有可能在脚本中插入恶意代码。或者网站自身有漏洞而被攻击者所控制,最终导致攻击者篡改其提供的脚本。

攻击从本地加载的脚本

假设在一个开发环境中,工程师用<script src="http://127.0.0.1:4545/import.js"></script>加载本地Web服务器上的资源。如果在发布该应用时没有移除这个语句,那么攻击者可以使用如下手段来攻击目标:

攻击从局域网加载的脚本

继续假设一个开发环境,开发者用脚本来加载内部服务器的资源:<script src="http://192.168.0.111/import.js"></script>。这时候,攻击者也可以按照类似攻击本地资源的手法插入恶意脚本,只不过需要锁定一个ip罢了(SSRF,内网渗透,物理渗透)。

源于未注册域名的脚本

很多时候,工程师会在host文件中加入自定义的域名。这样一来省钱,二来不用部署。或者有些已经注册的域名忘记续费而过期了,如果发布时碰巧忘记移除它(比如<script src="https://securelayer7.net/import.js"></script>)。那么攻击者便有机可乘了:

加载动态 ip 的脚本

开发者很有可能会犯将 ip 设为动态这种低级错误。我们只需想办法获取该 ip 地址的控制权(思路也和内网类似),便可以攻击目标了。

因为输入加载错误的域名

很多时候,开发者会漏打或者错打域名(比方说:<script src="https://code.jqueri.com/import.js"></script>)我们可以趁机注册该域名并返回恶意代码

从一个运行 HTTP 的服务器加载脚本

如果一个脚本是用HTTP(不是HTTPS)传输的,那么我们可以用中间人攻击(arp攻击,icmp攻击)来篡改脚本并在其中注入内容。

防护措施


欢迎关注作者公众号


源链接

Hacking more

...