原文:《Cross-Site Scripting #3 Bad JavaScript Imports》
译者:Twosecurity
在这篇文章里,我们将换一个姿势利用 XSS。通常来讲,XSS 是由程序对输入缺乏合理的过滤而产生的。但在这篇文章里,我会展示如何在正确过滤 XSS 的网站中利用 XSS。它和常规攻击手段类似,我们也可以用它来偷 cookie 或者钓鱼。不过在之前,我们先来讲解一下跨域资源共享技术。
跨域资源能够提供浏览器更好的用户体验。通过它,我们可以在一个网站上访问到不属于它域下的资源(比如图像,javascript,以及其它数据)。打个比方:
http://example.com 有如下跨域资源:
<iframe src>
标签包含http://youtube.com<img src>
请求http://imgur.com的图片<script src>
请求https://code.jquery.com/jquery-1.8.1.min.js取得的javascript库当许多网站同时引用<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');" //某个事件
由于控制权的缺失,加载第三方控制的脚本有十分严重的安全隐患。第三方网站的站长有可能在脚本中插入恶意代码。或者网站自身有漏洞而被攻击者所控制,最终导致攻击者篡改其提供的脚本。
假设在一个开发环境中,工程师用<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 地址的控制权(思路也和内网类似),便可以攻击目标了。
很多时候,开发者会漏打或者错打域名(比方说:<script src="https://code.jqueri.com/import.js"></script>
)我们可以趁机注册该域名并返回恶意代码
如果一个脚本是用HTTP(不是HTTPS)传输的,那么我们可以用中间人攻击(arp攻击,icmp攻击)来篡改脚本并在其中注入内容。