点击劫持(clickjacking)又称为界面伪装攻击 (UI redress attack)是一种在网页中将恶意代码等隐藏在看似无害的内容(如按钮)之下或者将透明的iframe覆盖在一个正常的网页上,并诱使用户点击的手段。也可以与 XSS 和 CSRF 攻击相结合,突破传统的防御措施,提升漏洞的危害程度。
攻击原理
攻击者实施攻击的一般步骤是:
- 黑客创建一个网页利用iframe包含目标网站;
- 隐藏目标网站,使用户无法察觉到目标网站存在;
- 构造网页,诱骗用户点击特定按钮 (图1中的PLAY!按钮);
- 用户在不知情的情况下点击按钮,触发执行恶意网页的命令。
防御方法
服务端防御
X-FRAME-OPTIONS 机制
X-FRAME-OPTIONS是微软提出的一个http头,专门用来防御利用iframe嵌套的点击劫持攻击。并且在IE8、Firefox3.6、Chrome4以上的版本均能很好的支持。这个头有三个值:
- DENY // 拒绝任何域加载
- SAMEORIGIN // 允许同源域下加载
- ALLOW-FROM // 可以定义允许frame加载的页面地址
如果浏览器使用了这个安全机制,在网站发现可疑行为时,会提示用户正在浏览 网页存在安全隐患,并建议用户在新窗口中打开。这样攻击者就无法通过 iframe 隐藏目标的网页。
例如github添加了这个头并且设置为deny,因此不能被嵌套到其他iframe中。
而百度没加,因此能被嵌套到其他iframe中。
stackoverflow加入了X-Frame-Options : SAMEORIGIN,以stackoverflow为例,在测试页面中用iframe嵌入stackoverflow:
<iframe src ="http://stackoverflow.com/"></ iframe>
打开这个页面,得到下面错误:
Java中设置x-frame-options:
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
//必须
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
//实际设置
response.setHeader("x-frame-options", "SAMEORIGIN");
//调用下一个过滤器(这是过滤器工作原理,不用动)
chain.doFilter(request, response);
}
Nginx配置:
add_header X-Frame-Options SAMEORIGIN
Apache配置:
Header always append X-Frame-Options SAMEORIGIN
使用 FrameBusting 代码
使用 JavaScript 脚本阻止恶意网站载入网页。如果检测到网页被非法网页载入,就执行自动跳转功能。Frame Busting代码是一种有效防御网站被攻击者恶意载入的方法,网站开发人员使用Frame Busting代码阻止页面被非法载入。
使用认证码认证用户
点击劫持漏洞通过伪造网站界面进行攻击,网站开发人员可以通过认证码识别用户,确定是用户发出的点击命令才执行相应操作。识别用户的方法中最有效的方法是认证码认证。例如,在网站上广泛存在的发帖认证码,要求用户输入图形中的字符,输入某些图形的特征等。
客户端防御
升级浏览器
最新版本的浏览器提供很多防御点击劫持漏洞的安全机制,对于普通的互联网用户,经常更新修复浏览器的安全漏洞,能够最有效的防止恶意攻击。
NoScript 扩展
对于Firefox的用户,使用 NoScript 扩展能够在一定程度上检测和阻止点击劫持攻击。利用 NoScript 中 ClearClick 组件能够检测和警告潜在的点击劫持攻击,自动检测页面中可能不安全的页面。