本文转载自 朱英达的个人网站,转载本文请注明出处。 原文地址
除了XSS和CSRF之外,还有一个被称为ClickJacking的web安全漏洞常常被大家遗忘,但绝对不能忽略。 ClickJacking翻译过来叫做点击劫持,或者界面劫持。 这个漏洞能够执行的关键在于html4.01提供的iframe标签,通过它web开发者可以实现页中页这样的东西。 最初在道哥的那本《白帽子讲Web安全》里看到的了这个漏洞,要么是道哥在写这本书时故意想留一手,要么是我的阅读理解能力差,总之当时我还真就是不以为然的,为什么呢? 利用透明的iframe去做一些文章对于web开发者来说根本不算什么难事,而如果已经把自己的iframe植入到别人的页面中去了,那我为什么不xss呢? 突然有一天,我真正理解了这个漏洞真实的应用场景:我们真正要做的,并不是把自己的页面放到iframe里嵌入别人的页面,而是要把别人的页面利用iframe嵌入到自己的网站页面中来,再通过UI上面的欺骗,诱使用户“做他原本不想做的事情”。怎么样,细思极恐吧?
下面展示一个具体的示例进行进一步说明: 如上图所示,我构造了这样一个页面,这个页面可以放在我们自己的网站上,在其中插入一个iframe,嵌入了一个qq安全中心的页面,为了方便观察,我把iframe的透明度设置为0.5。 由于iframe被设置了绝对定位而且其z-index值高于静态文档流,所以用户的所有click都会被这个iframe捕获,而透过iframe用户看到的是底下的DOM,红色的按钮上面写着“点我”,对用户起到诱导作用。 当用户像往常一样点击红色的按钮时,他实际点到的是这个iframe中的DOM,这会触发qq安全中心页面当中的相应逻辑。 如果把红色的按钮换成一张美女图片,这个漏洞对用户的诱导性将会很强。 如果把iframe的透明度调到0,像这样:
用户将会完全察觉不到在iframe这个页中页里面发生的任何事情,不知不觉中就踏入了黑客所精心构造的陷阱之中。 我曾经在很多网站看到过这样的业务逻辑:根据用户的cookie识别登录状态,对于已登陆的用户,允许其通过点击一个按钮快速的冻结自己的账户,甚至修改自己的密码。 事实上,把这个漏洞的危害说大一点,黑客不仅可以劫持用户的鼠标点击,还可以劫持移动端WAP页面的各种手势,甚至是通过一系列诱导,引导用户键盘输入黑客想让用户输入的东西。 这样的页面如果遭到黑客点击劫持,后果将会不堪设想。
我们不知道会不会有人构造这样一个外层页面包裹我们自己的网站页面去进行界面劫持,那么我们应当如何进行防御呢? 主要有两种办法: 1.在页面的http头里加入“X-FRAME-OPTIONS”,将其值设为“DENY”即可阻止任何其他页面对当前页面在iframe中进行加载,此http属性支持IE8+浏览器。 上面这段代码是Node.js的express框架中对页面的http头设置,以此可以实现,在其他页面中以iframe的方式加载此页面会被浏览器拦截:
2.通过javascript在页面中进行一些逻辑判断,具体的做法是这样: 把上面这段代码放到页面的head中,在加载时做预先判断。主要思路是,先把页面的body藏起来,判断此时页面并没有被嵌套在一个iframe时,再把body显示出来。
对于点击劫持,网上还有很多js实现的防御判断,但由于年代久远和水平良莠不齐,很多判断可以通过多层嵌套iframe的方式将其绕过。 以上总结的两条,亲测有效。 此文章中涉及到的ClickJack相关代码都在我的开源项目veneno中保存,此项目专注于web安全方面的所有攻击和防御行为进行实践,有兴趣可以看一下。
本文转载自 朱英达的个人网站,转载本文请注明出处。 原文地址
这个漏洞很少听说过啊
把内容同步发一份过来 我给你加精华
这个应用场景以前还真没想过。 赞一个先
这好像是老东西了,很多年前就看到过一些解决方案。
高明,最终还是需要防御xss
mark
嗯,的确容易遗漏,谢谢分享
网络安全刻不容缓了。
我尽然看懂了,为什么我学这些东西,学的那么快。