【走高速】XSS 防御方法

这里分两个方向来说XSS的防御方法,PART I 是从具体的原理机制上讲,PART II 是从业务形式上说;另外,因为DOM-Based XSS比较特殊,所以另外分成一个PART III 写对它的防御。


PART I

  • 输入过滤
  • 输出过滤(编码-encode)
  • 黑名单
  • HttpOnly Cookie

1、输入过滤

在客户端和服务器端都要进行过滤

1、输入验证

  • 字符合法
  • 字符串长度限制
  • 数字范围
  • 字符串格式,如email,tel等

2、数据消毒

过滤和净化有害输入,如一些敏感字符< > " ' & javascript 等。

2、输出过滤(编码-encode)

对页面输出进行编码,转义等过滤操作。

X、黑白名单

这个其实就是输入过滤和输出过滤的实现机制。顾名思义,没什么好说的。我不知道该怎么去分类了,这里就让它在这里吧。知道这个概念就好。

4、HttpOnly Cookie

这个方法是专门针对窃取cookie而设计的。被加上HttpOnly标志的cookie会禁止javascript访问该cookie。


PART II

  • 定制过滤策略
  • Web安全编码规范
  • 使用防XSS类库,如Anti_XSS
  • 使用WAF

PART III(DOM-Based)

DOM-Based XSS概念

DOM型XSS由客户端脚本通过DOM动态地输出数据到页面中,它不依赖于提交数据到服务器,而是从客户端获得DOM中的数据在本地执行。


其实对这段话(DOM型XSS的概念)的理解,网上基本上没有人说得让我明白(是我理解不行?),最终竟然在一篇文章上领悟了一下。 [DOM Based Cross Site Scripting or XSS of the Third Kind]http://www.webappsec.org/projects/articles/071105.shtml。(其实还是要结合看过的虽然没能让我一下明白的所有的资料来才能开窍的——一个知识积累的过程)。

我就把我的理解,用大白话在这里写一遍。
首先,DOM会被解析,写入HTML。

概念上所谓的“不依赖于提交数据到服务器,而是从客户端获得DOM中的数据在本地执行”中,“不依赖于提交数据到服务器”,其实这样说很误导人吧,后边再说明一下。

先说说“从客户端获得DOM中的数据”,这个其实就是说,在HTML中,使用DOM语言,获取一些本地数据,这个数据可以是浏览器上的东西,也可以是本地主机上的东西等,比如URL、location、globalStorage等。这一步完全不涉及远程机器对吧。
攻击的时候,攻击者通过URL构造参数传递XSS脚本,使得被攻击方使用DOM将攻击脚本写到它的HTML里(DOM会被解析,写入HTML),并执行。

e.g.

假设被攻击方 www.abc*.com/ttt.html 页面有 document.URL的操作语句,这个东西存储着当前页面的URL,比如你输入参数user=alim,那么 document.URL就等于 www.abc*.com/ttt.html?user=alim , 或者输入hong,那么变成 www.abc*.com/ttt.html?user=hong ,它始终是会随着参数变化的,总之就是一个 完整的指向当前页面的 URL。
===>
这样,当攻击方将user参数构造为一个脚本 <script>alert(111)</script>
===>
这段脚本也会被存在被攻击方的 document.URL中,而因为被攻击方在文档中执行了 document.URL操作(具体这里不考虑了,就这么带过),那么这个脚本也就 假借了URL的名义 被写入HTML中,而HTML里的脚本是要被执行的。攻击成功。

你看攻击者不是也要输入内容到服务器吗?这就对了,概念上说的是不依赖于输入数据。。。我们上边输入的本质上不能叫数据,联想一下其它两种XSS方式就可以想清楚这之间的区别。我们这里的注入只是将它作为document.URL 的“文本”,而反射型和存储型XSS中,我们直接将输入作为了HTML的数据

用这样深的词汇,真的是只会误导人啊。。。


DOM-Based XSS防御

1、根据上边的原理,那么可以分析和强化客户端javascript代码。具体可能受到影响的DOM对象有:

从URL获取的:

  • document.URL
  • document.URLUnencoded
  • document.location
  • window.location

Referrer属性:

  • document.referrer

Windowname属性:

  • window.name

本地存储对象:

  • document.cookie
  • HTML5 postMessage
  • localStorage/globalStorage
  • XMLHTTPRequest response
  • Input.value
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章