引用外部脚本的隐患及防御
在这篇文章里,我们将换一个姿势利用 XSS。通常来讲,XSS 是由程序对输入缺乏合理的过滤而产生的。但在这篇文章里,我会展示如何在正确过滤 XSS 的网站中利用 XSS。它和常规攻击手段类似,我们也可以用它来偷 cookie 或者钓鱼。不过在之前,我们先来讲解一下跨域资源共享技术。
跨域资源共享
跨域资源能够提供浏览器更好的用户体验。通过它,我们可以在一个网站上访问到不属于它域下的资源(比如图像,javascript,以及其它数据)。打个比方:
http://example.com 有如下跨域资源:
- 通过 XMLHttpRequest 请求http://securelayer7.net已登陆用户的数据
- 用<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');" //某个事件
由 javascript 引用而导致的漏洞
由于控制权的缺失,加载第三方控制的脚本有十分严重的安全隐患。第三方网站的站长有可能在脚本中插入恶意代码。或者网站自身有漏洞而被攻击者所控制,最终导致攻击者篡改其提供的脚本。
攻击从本地加载的脚本
假设在一个开发环境中,工程师用<script src="http://127.0.0.1:4545/import.js"></script>加载本地Web服务器上的资源。如果在发布该应用时没有移除这个语句,那么攻击者可以使用如下手段来攻击目标:
- 登陆运行该应用的电脑(物理渗透,SSRF)
- 用一个 Web 服务器监听本地4545端口,并返回恶意js。
- 目标在该电脑上开启浏览器,进入这个程序
- 浏览器加载恶意 JavaScript,导致XSS
攻击从局域网加载的脚本
继续假设一个开发环境,开发者用脚本来加载内部服务器的资源:<script src="http://192.168.0.111/import.js"></script>。这时候,攻击者也可以按照类似攻击本地资源的手法插入恶意脚本,只不过需要锁定一个ip罢了(SSRF,内网渗透,物理渗透)。
源于未注册域名的脚本
很多时候,工程师会在host文件中加入自定义的域名。这样一来省钱,二来不用部署。或者有些已经注册的域名忘记续费而过期了,如果发布时碰巧忘记移除它(比如<script src="https://securelayer7.net/import.js"></script>)。那么攻击者便有机可乘了:
- 注册http://securelayer7.net并返回import.js
- 用户浏览时会加载我们的恶意脚本
加载动态 ip 的脚本
开发者很有可能会犯将 ip 设为动态这种低级错误。我们只需想办法获取该 ip 地址的控制权(思路也和内网类似),便可以攻击目标了。
因为输入加载错误的域名
很多时候,开发者会漏打或者错打域名(比方说:<script src="https://code.jqueri.com/import.js"></script>)我们可以趁机注册该域名并返回恶意代码
从一个运行 HTTP 的服务器加载脚本
如果一个脚本是用HTTP(不是HTTPS)传输的,那么我们可以用中间人攻击(arp攻击,icmp攻击)来篡改脚本并在其中注入内容。
防护措施
- 从本地或者内网 ip 加载的脚本都要被替换成其它安全位置的脚本
- 严格管控现有的域名,确保知道哪些过期了,哪些没有
- 脚本不应该从动态 ip 中引入
- 再三检查输入域名是否配对真实域名
- 尽可能地使用 https
- 脚本应该尽量存放在安全性高的第三方网站
- 如果你不能保证上述几点,不要因为追求性能而无视安全性(引用脚本改成内联)
作者:Saurabh Banawar —— http://blog.securelayer7.net/owasp-top-10-cross-site-scripting-3-bad-javascript-imports/