OWASP TOP 10之如何防御XSS攻击

      OWASP TOP 10之如何防御XSS攻击无评论

OWASP TOP 10之如何防御XSS攻击

  尽管大多数人都了解XSS的成因,但是要彻底防止XSS攻击并不容易。因为XSS的表现形式各异,利用方式灵活多变,所以不能以单一特征来概括所有XSS攻击,这就给XSS漏洞防御带来了极大的困难。

  造成这种现象的原因主要有方面。

  首先,Web浏览器本身的设计是不安全的。浏览器只是用于通过URL来获取并显示Web网页的一种软件工具,网络传输过来的数据有的是浏览器用户需要的、能够看到的,也有的是浏览器不能显示的。这些不能显示的内容可能是对用户是透明的协议工作内容,也可能是恶作剧代码,抑或是蓄意破坏的代码,他们会窃取用户计算机上的隐私,甚至会对计算机设备造成破坏。不可否认,Web浏览器包含了解释和执行JavaScript等脚本语言的能力,这些语言可能来创建各种丰富的功能,浏览器只会去执行,而不会判断数据或代码片段是否恶意。

  其次,大部分Web开发人员都未受过正规的安全培训,因此没有创建好安全的网站,导致攻击者能利用网络的安全漏洞,注入恶意代码发起攻击。

  首先,Web浏览器本身的设计师不安全的。浏览器只是用于通过URL来获取并显示Web网页的一种软件工具,网络传输

  在OWASP TOP 10中是这样描述的:

  最好的方法是根据数据将要置于HTML上下文(包括主体、属性、JavaScript、CSS或URL)对所有的不可信数据进行恰当的转义。 使用正面或“白名单”的,具有恰当的规范化和解码功能的输入验证方法同样会有助于防止跨站脚本。但由于很多应用程序在输入中需要特殊字符,这一方法不是完整的防护方法。这种验证方法需要尽可能地解码任何编码输入,同时在接受输入之前需要充分验证数据的长度、字符、格式和任何商务规则。

  0x00 使用XSS Filter

  众周所知,XSS跨站攻击主要从客户端发起,尽管执行时受到很多限制,却能造成更严重的后果。

  XSS Filter作为防御跨站攻击的主要手段之一,已经广泛应用在各类Web系统之中,包括现今的许多应用软件,例如IE 8浏览器,通过加入XSS Filter功能可以有效防范所有非持续性的XSS攻击

OWASP TOP 10之如何防御XSS攻击

  如图可视IE 8拦截跨站脚本的效果。

  但是,XSS本质上是Web应用程序的漏洞,仅仅依靠XSS Filter等客户端的保护是不够的,解决问题的根本是Web应用程序的代码中消除XSS安全漏洞

  0x01 输入过滤

  我们都知道,跨站脚本攻击是通过一些正常的站内交互途径,如果用户提交了含有恶意JavaScript的内容,服务器端没有及时的过滤掉这些脚本,那么就会造成跨站脚本攻击

  对输入数据的过滤,具体可以从两方面来着手:输入验证和数据消毒

  输入验证

  输入验证要根据实际情况来设计

  输入是否仅仅包含合法的字符 输入字符串是否超过最大长度限制 输入如果为数字,数字是否在指定的范围内 输入是否符合特殊的格式要求 数据消毒

  除了在客户端验证数据的合法性,输入过滤中最重要的还是过滤和净化有害的输入,例如以下常见字符

  | < > ‘ “ & # javascript expression

  但是,仅过滤以上敏感字符是远远不够的。

  为了能够提供两层防御和确保Web应用程序的安全,对Web应用的输入也要进行过滤

  和编码。

  0x02 输出编码

  如果没有对用户输入的数据进行过滤而是将用户输入的信息完完整整的呈现出来,就会产生一个XSS

OWASP TOP 10之如何防御XSS攻击

  攻击者会故意尝试各种错误的输入,应用程序若检查到输入的内容不合法,马上会通过页面返回错误提示。这些错误信息的反馈正是攻击者需要的,攻击者可以通过观察借此进一步发起攻击。攻击原理和SQL注入的原理是一样的。

  HTML编码在防止XSS攻击上可以起到很大的作用,它主要是用对应的HTML实体提单字面量字符,这样做可以确保浏览器安全处理可能存在的恶意字符,将其当做HTML文档的内容而非结构加以处理。

  实际情况中,可以根据需求选择比较合适的过滤方式。建议同时采取两种方式,结合使用输入过滤和输出过滤编码能够提供两层防御,即使攻击者发现其中一种过滤存在缺陷,另一种过滤仍然在很大程度上阻止其实施攻击。

  0x03 黑名单和白名单

  不管是采用输入过滤还是输出过滤,都是针对信息进行黑/白名单式的过滤。

  黑名单式的过滤,就是程序先列出不能出现的对象清单,如对<和>这两个关键字符进行检索,一旦发现提交信息中包括<和>字符,就认定为XSS攻击,然后对其进行消毒、编码或者禁用操作。

  白名单式的过滤和黑名单相反,不是累出不被允许的对象,而是列出可被接受的对象。

  纯粹采用黑名单式的过滤方式是不行的。

  黑名单 白名单 说明 过滤可能造成危害的符号及标签 仅允许执行特定格式的语法 实例 发现使用者输入的参数值为

  就将其取代为空白

  仅允许

OWASP TOP 10之如何防御XSS攻击

  格式,其格式码一律取代为空白 优点 可允许开放某些特殊HTML标签 可允许特定输入格式的HTML标签 缺点 可能因过滤不干净而使攻击者绕过规则 验证程序编写难度较高,且用户可输入变化减少

  0x04 定制过滤策略

  下面,我们针对一些常见的XSS形式来讨论如何定制安全的过滤策略

  正如前面所说那样,黑名单式的过滤策略往往存在很多问题,只能根据已知的XSS攻击来进行检测,而无法对其变种或是新的XSS攻击做出反应

  例如:将

  经过过滤之后,代码变成

  这种变形的XSS攻击之所以能够成功,是因为很多XSS检测策略往往只考虑到最为一般的形式,而事实上,即使攻击者注入的代码有些变形,浏览器还是会尽力而为地对他们进行解释,于是XSS攻击仍然会发生。

  0x04 Web安全编码规范

  在安全领域,有一条黄金法则:“一切输入都是有害的”。即使是这样,因为业务需求,不可能完全过滤用户输入的某些内容,比较可行的解决方案就是在服务端进行Web安全编码,让有害的数据变成无害。

  在输出数据前对潜在威胁的字符进行编码、转义,是防御XSS攻击的有效措施

  这些输出一般是动态内容。对Web应用而言,其动态内容可能来源于用户输入、URL、HTTP头,POST数据、Cookies的值、查询关键字等,所以,在应用不同背景下的动态内容的XSS攻击时,要部署不同的解决方案

  总体来说,Web安全代码规范表达的实际上是同一个理念:将未信任数据嵌入到任何输出之前都应按照上下文的转义规则对其进行编码。

  0x05 防御DOM型XSS

  DOM型XSS是一种比较特殊的XSS

  ,所以采用的防御方法也和常规的方法有很大不同。

  DOM型XSS主要是由客户端的脚本通过DOM动态地输出数据到页面中,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行。由于被处理的数据不在服务器的直接控制范围内,所以仅有服务器端部署防御措施是无法解决问题的。

  防范基于DOM的XSS攻击要注意两点。

  避免客户端文档重写、重定向或其他敏感操作,同时避免使用客户端数据,这些操作尽量在服务器使用动态页面来实现。 分析和强化客户端JavaScript代码,尤其是一些受到用户影响的DOM对象

  从URL获取的:

  1 2 3 4 Document.URL Document.URLUnencoded Document.location(.pathname|.href|.search|.hash) Window.loaction(.pathname|.href|.search|.hash)

  Referrer属性

  1 Document.referrer

  Windowname属性:

  1 Window.name

  其他的输入源也可能会导入DOM型的XSS,包括一些本地储存对象,如:

  1 2 3 4 Document.cookie HTML5 postMessage LocalStorage/globalStorage Input.value

  0x06 其他防御方式

  XSS的攻击已经相当成熟,丰富的攻击技巧更是令人眼花缭乱。相比之下,针对XSS的检测和防范方法显得捉襟见肘。

  幸运的是,尽管很难对XSS攻击做出有效检测,但是如果能依照一定的方法对XSS进行防范,XSS攻击便很难造成实质性的危害

  (一)、Anti_XSS

  Anti_XSS是微软开发的(.NET平台下)用于防止XSS跨站脚本攻击的类库,它提供了大量的编码函数用于处理用户的输入,可实现输入白名单机制和输出转义。

  (二)、HttpOnly Cookie

  窃取Cookie是最常见的XSS攻击手法之一,即利用XSS攻击手法来打破同源策略。在同源策略规范下,Cookie理应只能提供给同源下的网页读取使用,然而透过XSS漏洞,攻击者可以利用JavaScript中的document.cookie方法窃取用户的Cookie

  (三)、WAF

  除了使用以上方法地域跨站脚本攻击,还可以使用WAF抵御XSS、

  WAF指Web应用防护系统或Web应用防火墙,是专门为保护给予Web应用程序而设计的,主要的功能是防范注入网页木马、XSS以及CSRF等常见漏洞的攻击,在企业环境中深受欢迎。

发表评论