Freigeben über


跨网站指令码攻击的原理、御防与解决方法

跨网站指令码(Cross-site scripting,通常简称为 XSS)是一种网站应用程式的安全漏洞攻击,允许恶意使用者将程式码注入到网页上,其他使用者在观看网页时就会受到影响。这类攻击通常包含了 HTML 以及使用者端脚本语言。[1]

怎么发现的?

当网景(Netscape)最初推出 JavaScript 语言时,他们察觉到准许网页伺服器传送可执行的程式码给一个浏览器的安全风险(即使仅是在一个浏览器的沙盒里)。它所造成的一个关键的问题在于使用者同时开启多个浏览器视窗时,在某些例子里,网页里的片断程式码被允许从另一个网页或物件取出资料,而因为恶意的网站可以用这个方法来尝试窃取机密资讯,所以在某些情形,这应是完全被禁止的。为了解决这个问题,浏览器采用了与最初相同的决策 - 允许来自相同网域名称系统和使用相同协定的物件与网页之间的任何互动。这样一来,恶意的网站便无法借由 JavaScript 在另一个浏览器窃取机密资料。此后,为了保护使用者免受恶意的危害,其他的浏览器与伺服端指令语言采用了类似的存取控制决策。一般而言,跨网站指令码的漏洞常见于网页允许攻击者通过这些机制的弱点。由于发现了巧妙的注入恶意的指令码到由其他网域服务的网页方法,攻击者可得到了更高的特权,窃取机密的网页内容、会谈的cookie、以及许多其他的物件。[1]

为什么不叫 CSS?

写网站程序的朋友们应该知道 CSS 在网页设计领域已经被广泛指层叠样式表(Cascading Style Sheets),所以将 Cross 改以发音相近的 X 做为缩写。但早期的文件还是会使用 CSS 表示 Cross-site scripting。[1]

XSS 怎么攻击的

有三种类型:

类型 A - 本地利用漏洞,这种漏洞存在于页面中客户端脚本自身。[2]

简而言之,就是你点了一个别人给你的网址,结果这个网址其实藏了一个恶意的 JavaScript,当你开启这个网页的时候,这个恶意程序就装在你的电脑上了。而这个恶意的 JavaScript 可以根据该电脑的使用者权限来执行命令。

结论:不要乱点不知道的网址或网页。反正不知道不清楚的就别乱按。这些恶意的网址或网页可能会透过你的邮件、QQ、MSN 等工具传给你。

类型 B - 反射式漏洞,这种漏洞和类型 A 有些类似,不同的是 Web 客户端使用Server端脚本生成页面为用户提供数据时,如果未经验证的用户数据被包含在页面中而未经 HTML 实体编码,客户端代码便能够注入到动态页面中。[1, 2, 3]

简而言之,就是你经常访问的站点或网页没有对用户输入的地方和变数进行长度与特殊字符的过滤。

结论: 世界上没有 100% 安全的浏览器,就算是 Firefox 也同样不安全。 对于 Web 应用的程序员而言,有几点建议:

  1. 把精力放在所有对使用者提交的内容进行可靠的输入验证,这些提交的内容包含:URL、查询的关键字、http 标头、post 信息等。只接受你所规定长度范围内,采用适当格式、你所希望的字符、阻挡、过滤或忽略其他任何东西。 避免XSS的方法主要是将使用者所提供的内容进行过滤,许多语言都有提供对HTML的过滤:
    PHP 的 htmlentities() 或是 htmlspecialchars()
    Python 的 cgi.escape()
    ASP 的 Server.HTMLEncode()
    ASP.NET 的 Server.HtmlEncode() 或功能更强的 Microsoft Anti-Cross Site Scripting Library
  2. 保护所有敏感的功能,以防被自动执行或是协力厂商的网站执行。实现 session 标记(session tokens)、CAPTCHA 系统或 HTTP 引用标头检查。
  3. 如果你的 Web 应用程序必须支持用户提供的 HTML,那么你应该确认你接收的 HTML 内容被妥善的格式化,仅包含最小化的、安全的 tag(绝对没有 JavaScript),去掉任何对远端内容的引用(尤其是样式表和 JavaScript)。为了更多的安全,请使用 http only cookie

类型 C - 存储式漏洞,该类型是应用最为广泛而且有可能影响到Web服务器自身安全的漏洞,骇客将攻击脚本上传到 Web 服务器上,使得所有访问该页面的用户都面临信息泄漏的可能,其中也包括了Web服务器的管理员。[2]

简而言之,就是你经常访问的站点本身已经被骇客侵入了,而骇客已经攻击的脚本上传到 Web 的服务器上。

结论:尽量不要访问曾遭骇客攻击还未修复的漏洞的站点。

 

参考资料:

  1. 百度百科 - 跨网站指令码
  2. XSS 攻击防御技术白皮书
  3. 浅析 XSS 漏洞原理
  4. 台湾微软资安部落格
  5. gipi 的学习笔记