网络安全 频道

王文君:XSS检测防范技术与实例研究

  【IT168 资讯】以“互联网安全新思维”为主题的OWASP2011亚洲峰会在11月8日-9日成功举办。本届大会以“网络安全产品测评”、“OWASP应用安全技术”“业务安全发展新思路”“云安全”等多个角度展开深入的讨论。关于如何做到有效的防范XSS,HP软件上海实验室安全架构师王文君分享了《XSS检测防范技术与实例研究》演讲。

王文君:XSS检测防范技术与实例研究
▲HP软件上海实验室安全架构师王文君演讲

  王文君首先介绍说:“本次演讲的目的不是训练你成为一个跨站师,而是让你理解跨站攻击运行原理,如何解决防范它。我们假设有这么一个社交网络,任何人可以关注任何人未经许可,一旦关注一个人以后,这个好友发的任何帖子都可以看到,这是“微博”。今年上半年的时候,我国著名微博发生了跨站攻击性事件。”

  假设左边戴墨镜的黑客发布的恶意代码,起了一个好听的名字,黑客告诉我们你点击这个链接就可以得到结果,路人甲点了一下,我们看到红色的部分,路人甲把黑客加为好友,路人甲同样发布了同样的信息,这个时候路人甲的朋友,路人乙,路人乙看到帖子忍不住也点击了,如此类推,蠕虫就形成了,这就是今年新浪微博跨站蠕虫攻击简单的运行原理。

  各位都是搞安全领域的,请允许我从简单说起,这是很简单的Hello Alexander程序,如果脚本被原封不动执行起来的话,网站就存在着漏洞。我们再分析一下这是蠕虫病毒的攻击原理,黑客发布的一些具有鼓动性,诱惑性的信息,比如说你没见过的照片,是不是艳照门的续集呢?所以就很感兴趣,你点击连接的时候,有可能执行脚本,又发布了一个信息,我们弹出对话框“ I Follow you!”,从上往下看,下面会看到执行一个操作,通过上面随机定义好一些信息,在新浪用了一些XSS进行攻击。

  为什么会成功呢?当时输入无过滤,输出无编码,这两个方式一个都没有执行。我们如果从深层次想一想为什么会成功呢?在座各位都知道美国有一个著名的黑客写了一本书《欺骗的艺术》,因为人们胆小、懦弱、无知、贪婪的特性,利用这些特征防护再怎么严格的网站,我也可以轻易的攻破它。人有好奇心,而好奇害死猫。我理解是“所以,陌生的链接不要点”。

  介绍这个案例之后,XSS的定义,我引入了百度百科如此说“嵌入其中Web里面的html代码会被执行”,维基百科说“它允许恶意用户将注入到网页上,脚本没有经过验证直接会执行”。

  OWASP Top 10A2跨站脚本,2010年跨站脚本跌下了状元的宝座,所以它的威胁还是不可小看的。

  XSS分类有三种:

  反射式的,点击不良链接,如刚才介绍的蠕虫。

  存储型的,脚本存在服务器里,受害者访问页面的时候,脚本会进行直接进行执行。比如著名的Samy Worm。

  以上两种是服务器端的执行。

  基于DOM,直接在客户端执行。

  这个时候同学要问了,你说反射式的,我在上网浏览,有一些链接不敢点,那整个网络真的是步步惊心吗?我写了一首诗分给大家,诗还没有到,对不起记错了。

  先介绍存储型XSS:

  存储型XSS,比如Goat,它就是网络绵羊,网络绵羊是很好的让大家来实践,非常好的项目。比如戴维登录个人简介,修改了一段脚本,这个时候经理层次布鲁斯要关心下属,是不是要加工资了,戴维登录以后看布鲁斯的个人简介,这个时候界面上弹出了,因为布鲁斯输入了脚本,所以另外一个人访问的时候就中招了。

  这是我做的一首小诗:

  你点,或者不点,蠕虫就在那里,不增不减。
  你看,或者不看,XSS就在那里,不来不去。
  漠然相逢。
  寂静,悲怆。

   基于DOM的XSS,你输入什么,上面显示什么,如果在文本框输入了IMG SRC之后,上面是不是也会显示?如果这样的话,这个站点存在着跨站的注射。用户输入一个字符串没有做任何的处理,这是displayGreeting的内容。

  我们介绍一下如何检测XSS。我自己做了一个小总结,如果检测的话,我自己总结分为:手动、半自动、全自动。

  手动:

  手动利用比较方便,不用借用任何工具,可以对各个字段输入一些字符串,分享到页面或者与数字相链接的页面是否会弹出一些对话框。针对不同的方式,有一些脚本。下面列举了一些比较常用的检测方式,我希望大家看一下XSS Cheat Sheet,它刚才建立的时候,我也不理解它的意思,“欺骗的纸”什么意思?大家有没有打过小抄的概念?我理解是“小抄”的概念,这是很简洁的一张纸会介绍简单的方式,希望大家认真的看一下。

  狙击枪与冲锋枪,如果一个一个拦截用狙击枪太慢了,我们迫切需要冲锋枪,OWASP提供了一个工具叫做WebScrab,我们提交任何一个请求都被大家拦截到,你可以选择一个Fuzz Sources脚本,它提供一个默认的脚本,很多字符串可以浏览一下,自己也可以增删改,如果你选择对字段选择文本的话,就意味着对这个字段,如果文本有64个字段,如果手工做的话,就会累死,但是我们是机器,所以是冲锋枪,就可以标记所有的运行,如果有跨站攻击有可能的漏洞,就有一些侯选,我们就可以分享一下。

  半自动检测,谷歌伟大工程师创造了Ratproxy工具,开启并作为浏览器代理,打开网页尽情浏览,可以分析日志。这个图是Ratproxy的分析日志,比如说我这里我们到XSS candidates,这是任何一个工具都不可避免的叫做误报,误报的话,提供candidates,还得用人脑子靠一下,主要看它的代码后四位是不是运行,然后进行维修。

  全自动检测,分两部分:静态检测和动态检测。

  静态检测有两个例子,OWASP开发了Lapse、HP Fortify Sca,程序不需要运行,只需要存储一些代码就可以运行来达到检测的目的。

  动态检测有两个例子:W3af和HP Web Inspect,他们都是这方面的佼佼者。

  这里是OWASP LAPSE的截图,我们开发的时候如果源头可以定义一些很仔细的规范,定这些规范可以去遵循,如果不小心不那么规范怎么办可以利用OWASP LAPSE达到这个目的,然后拉来分析。

  静态动态检测的优缺点,静态检测的有点可以直接分析源代码,通过语义匹配达到目的。可以与每日构建(Daily Build)完美结合,能把Developer可以在IDE上直接使用,但是有很多缺点,许多类型漏洞检测不出,比如权限认证,业务规则,静态检测怎么能检测出来?除非定一些很麻烦的规则,但是你又不一定得不偿失,权限控制。不能发现配置方面的问题,新它们不在代码里。存在着大量的误报(False Positive),我们到医院如果做乙肝检测,最怕是某某阳性,阳性心里不踏实。如果是“假的”就是误报,误报和漏报特别容易混淆,特别是英文。

  动态检测可以快速发现权限认证,权限控制以及配置方面的问题,比如输入名不对了,就让你进不去。每次运行的结果可以作为下次运行的基准线,执行成本比较低。但是也有一些缺点,需要一个学习曲线(如何配置、分析结果)、对于业务逻辑的安全漏洞无能为力,扫描发现的结果通常还是需要人工确认。

  这是我心目中的方案,不知道对不对,每日开发的时候,及早发现问题,每日构建有一些静态检测工具检测,进入稳定阶段。纵深防御一步一步的防御,我起一个好听的名字叫做“纵深测试”。

  我讲了一些类型和方式,我们如何防范它呢?作为开发者来讲所有的输入皆为恶。防范跨站攻击最主要途径有两个,对输入进行验证或者对输出进行编码。

  对输入验证

  验证一定要在服务器端,客户端验证是没用的。我们采用白名单而非黑名单,白名单比黑名单安全性高一点。采用OWASP AntiSamy进行输入过滤,它主要是采用了白名单,允许输入属性。

  对输出进行编码

  处处编码主要有五种,Html Content java script Attribute CSS URL

  有这么多编码,

  一个字符串:<img>

  在URL中的编码:%3Cimg%3E

  在Javascript中的编码:\x3Cimg\x3E

  同一个东西,同一个字符串在不同的表现形式有不同的编码。

  We have ESAPI提供了另外一种方式,它有很多不同目前方式,我这里主要推荐的是encode javascript,所以它是海纳百川,它可以提供自己的一些方式。

  我引用一句话作为本次演讲的结尾,美国著名的黑人领袖马丁路德金的话,我改写的是“我有一个梦想,股票永远不跌,房价永远不涨,我有一个梦想所有的肇事司机有错就要认,不管你的爸爸是李逵还是李刚,我有一个梦想,经过在座的搞安全的努力,所有的跨站攻击以后都无路可走,无处可藏。”


   相关链接:

  OWASP2011演讲PPT下载专辑http://topic.it168.com/factory/owasp_2011/index.html
  OWASP2011专题报道http://safe.it168.com/topic/2011/11-7/OWASP2011/index.html

0
相关文章