引用外部脚本的隐患及防御

引用外部脚本的隐患及防御

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

跨域资源共享

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

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


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

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

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

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

Function changeBachground(color) {
  Document.body.style.background = color;
}
 
Onload="changeBackground('red');" //某个事件

由 javascript 引用而导致的漏洞

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

攻击从本地加载的脚本

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

  • 登陆运行该应用的电脑(物理渗透,SSRF)
  • 用一个 Web 服务器监听本地4545端口,并返回恶意js。
  • 目标在该电脑上开启浏览器,进入这个程序
  • 浏览器加载恶意 JavaScript,导致XSS

攻击从局域网加载的脚本

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

源于未注册域名的脚本

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

加载动态 ip 的脚本

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

因为输入加载错误的域名

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

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

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

防护措施

  • 从本地或者内网 ip 加载的脚本都要被替换成其它安全位置的脚本
  • 严格管控现有的域名,确保知道哪些过期了,哪些没有
  • 脚本不应该从动态 ip 中引入
  • 再三检查输入域名是否配对真实域名
  • 尽可能地使用 https
  • 脚本应该尽量存放在安全性高的第三方网站
  • 如果你不能保证上述几点,不要因为追求性能而无视安全性(引用脚本改成内联)


作者:Saurabh Banawar —— blog.securelayer7.net/o

编辑于 2017-09-03 12:18