XSS攻击防御

2 XSS攻击防御
  
  2.1 XSS的传统防御技术
  
  2.1.1 基于特征的防御
  
  XSS漏洞和着名的SQL注入漏洞一样,都是利用了Web页面的编写不完善,所以每一个漏洞所利用和针对的弱点都不尽相同。这就给XSS漏洞防御带来了困难:不可能以单一特征来概括所有XSS攻击。
  
  传统XSS防御多采用特征匹配方式,在所有提交的信息中都进行匹配检查。对于这种类型的XSS攻击,采用的模式匹配方法一般会需要对“javascript”这个关键字进行检索,一旦发现提交信息中包含“javascript”,就认定为XSS攻击。这种检测方法的缺陷显而易见:骇客可以通过插入字符或完全编码的方式躲避检测:
  
  躲避方法1)在javascript中加入多个tab键,得到
  
  < IMG SRC=“jav ascript:alert(‘XSS’);” >;
  
  躲避方法2) 在javascript中加入 编码字符,得到
  
  < IMG SRC=“javascript:alert(‘XSS’);” >;
  
  躲避方法3) 在javascript中加入
  
  字符,得到
  
  < IMG SRC=“jav
  
  ascript:alert(‘XSS’);” >;
  
  躲避方法4)在javascript中的每个字符间加入回车换行符,得到
  
  < IMG SRC=“j\r\na\r\nv\r\n\r\na\r\ns\r\nc\r\nr\r\ni\r\np\r
  
  \nt\r\n:alert(‘XSS’);” >
  
  躲避方法5)对“javascript:alert(‘XSS’)”采用完全编码,得到
  
  < IMGSRC=javascrip&#x
  
  74:alert('XSS
  
  ') >
  
  上述方法都可以很容易的躲避基于特征的检测。而除了会有大量的漏报外,基于特征的
  
  还存在大量的误报可能:在上面的例子中,对“http://www.xxx.com/javascript/kkk.asp?id=2345”这样一个URL,由于包含了关键字“javascript”,也将会触发报警。
  
  2.1.2 基于代码修改的防御
  
  和SQL注入防御一样,XSS攻击也是利用了Web页面的编写疏忽,所以还有一种方法就是从Web应用开发的角度来避免:
  
  步骤1、对所有用户提交内容进行可靠的输入验证,包括对URL、查询关键字、HTTP头、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其他的一律过滤。
  
  步骤2、实现Session标记(session tokens)、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行。
  
  步骤3、确认接收的的内容被妥善的规范化,仅包含最小的、安全的Tag(没有javascript),去掉任何对远程内容的引用(尤其是样式表和javascript),使用HTTP only的cookie。
  
  当然,如上操作将会降低Web业务系统的可用性,用户仅能输入少量的制定字符,人与系统间的交互被降到极致,仅适用于信息发布型站点。并且考虑到很少有Web编码人员受过正规的安全培训,很难做到完全避免页面中的XSS漏洞(注 )。

猜你喜欢

转载自baijinshan.iteye.com/blog/706566