XSS与CSRF的防御

   之前在面试的总结中简单的提到了XSS的区分和CSRF的防御手段,现在补一篇学习记录,关于XSS和CSRF的防御手段。


XSS的防御措施

输入输出检查方式

输入检查:对用户输入的数据进行合法性检查,对输入数据中敏感字符进行过滤编码转义,针对特定类型数据进行格式检查。除格检查外的防御最好放在服务器端实现。

输出检查:对会输出到页面、脚本中的数据做编码转义操作,如果输出是变量,尽量保证输出的变量在引号的内部。

根据输出点分类防御

输出在HTML标签中:
针对在<div>$a</div>标签中输出的内容,我在测试的时候一般是直接构造攻击性标签进行测试,防御方法是对数据进行HTML编码。

输出在HTML属性中:
如<a href="$a">这种,在测试的时候会去闭合属性字符串,然后在后半部分加入我们的标签或事件,防御方法是也对数据进行HTML编码。

在HTML标签事件中:
如<input onclick="func($a)" />,这种输出点可以直接引入js代码,因此应当进行Javascriptencode,但是如果func的内容是对dom进行操作,可能还要考虑在不同的地方多次编码先jsencode再htmlencode,或者对数据进行过滤。

在CSS中输出:
这个在IE老版本中出现,书中推荐是用OWASP ESAPI中的encodeForCSS()函数。

在地址中输出:
,这种输出点一般测试中采用伪协议来测试,javascript:、dataURI:之类,因此防御方法是先检测协议是否正确,然后对数据中敏感字符进行URLencode。

富文本的处理:
根据书中描述,要禁止危险的标签,因此应尽量白名单,只允许安全的标签存在。

DOM-based XSS防御:
由于这种XSS的形成机制和其他有所差别,因此前面的单一处理方法可能不太实用,书里是对数据输入到脚本中进行一次js编码,从脚本输出到页面中进行一次html编码。

CSRF的防御措施

验证码

简单的对用户操作增加验证码操作,由于验证码不可被attacker预知,因此可以防御CSRF攻击,但是,出于用户体验的考虑,验证码的设置只能作为辅助手段。

referer check

referer的检查在安全等级上是低于token的,因此可能存在各种各样过滤不完善的问题,而且不是每个服务器都能获取到referer,而且HTTPS到HTTP也是不会带referer的。在某些flash版本中,referer是可以定制的,当然版本比较老了。因此,通过referer来防御CSRF是不太靠谱的,可以作为一种监测的手段。

token

一般针对token进行测试的时候,会测试token是否不可预测,是否可复用,如果放在Cookie中,打开多个页面消耗掉token怎么处理,有没有放在URL中(由此可能带来通过referer泄露的风险)。
token的本质,是不可预测性原则,攻击者无法从前端获取我们的token值,就无法构造出正确的URL。
如果存在XSS,则无法防御CSRF风险,应该用XSS的防御手段解决。


补充:现在看来,还是有很多相对传统的甲方公司或者小型外包公司对XSS之类漏洞的防范存在问题。目前接触到的项目,靠在输入检查做防御基本上都是不可接受的,特别是那种只采用了一个两个filter的模式。当然也可以看出根本没有什么安全开发的规范。 最常见的可能是使用velocity类似框架绑定输出宏或者类似的东西,根本上还是要有一个好的开发规范吧。

参考资料:《白帽子讲Web安全》


发表评论 暂无评论

*