漏洞原理:
点击劫持(Clickjacking),也称为“用户界面伪装攻击”(UI redressing attacks),是一种Web安全漏洞,攻击者利用它欺骗用户在不知情的情况下执行操作。点击劫持利用了Web页面可以被其他页面通过<iframe>嵌入的特性。攻击者创建一个包含隐藏或透明<iframe>的页面,该<iframe>嵌入了目标网站的内容,并覆盖上诱导用户点击的元素。
攻击方式:
- 创建攻击页面:攻击者制作一个包含透明<iframe>的页面,该<iframe>指向目标网站。
- 覆盖诱导元素:在<iframe>上覆盖诱导用户点击的按钮或链接,如“免费获得奖品”等。
- 诱导用户访问:通过社交工程或其他手段,诱导用户访问攻击者的页面。
- 执行恶意操作:用户在不知情的情况下点击攻击页面上的元素,实际上是在目标网站上执行操作。这个时候可以做的恶意操作就有很多,如诈骗、获取cookie,如果安全做的很差可以再和xss、csrf结合。
防御这些攻击主要有以下三种机制:
- 使用X-Frame-Options或Content Security Policy(CSP)中的frame-ancestors指令来阻止浏览器在frame中加载页面。
- 使用SameSite cookie属性来阻止当页面在frame中加载时会话cookie被包含。
- 在页面中实现JavaScript代码,尝试阻止其在frame中被加载(被称为“frame-buster”)。
注:这些机制彼此独立,尽量落地多种机制以实现纵深防御。
1.使用Content Security Policy (CSP) frame-ancestors指令进行防御
frame-ancestors指令可以在Content-Security-Policy HTTP响应头中使用,以指示浏览器是否允许在<frame>或<iframe>中渲染页面。网站可以使用此指令来避免Clickjacking攻击,确保它们的内容不被嵌入到其他网站中。
frame-ancestors允许网站使用常规的Content Security Policy语义授权多个域。
Content-Security-Policy: frame-ancestors 示例
CSP frame-ancestors的常见用法:
http
Content-Security-Policy: frame-ancestors 'none';
这阻止任何域对内容进行框架化。除非确定了框架化的特定需求,否则推荐使用此设置。
http
Content-Security-Policy: frame-ancestors 'self';
这只允许当前网站对内容进行框架化。
http
Content-Security-Policy: frame-ancestors 'self' *.somesite.com https://myfriend.site.com;
这只允许当前网站以及somesite.com上的任何页面(使用任何协议),并且只有在HTTPS上使用myfriend.site.com页面的默认端口(443)。
注意:围绕self和none的单引号是必需的,但可能不出现在其他源表达式周围。
限制
- 浏览器支持:不是所有主流浏览器都支持CSP frame-ancestors。
- X-Frame-Options优先级:CSP规范的“与X-Frame-Options的关系”部分说:“如果资源传递了一个包含名为frame-ancestors的指令且其处置为“enforce”的政策,则必须忽略X-Frame-Options头”,但Chrome 40和Firefox 35忽略了frame-ancestors指令,而遵循X-Frame-Options头。
2.使用X-Frame-Options响应头进行防御
X-Frame-Options HTTP响应头可以用来指示浏览器是否允许在<frame>或<iframe>中渲染页面。网站可以使用此来避免点击劫持漏洞,确保它们的内容不被嵌入到其他网站中。为所有包含HTML内容的响应设置X-Frame-Options头。
X-Frame-Options 头类型
X-Frame-Options头有三种可能的值:
- DENY,阻止任何域对内容进行框架化。除非确定了框架化的特定需求,否则推荐使用“DENY”设置。
- SAMEORIGIN,只允许当前网站对内容进行框架化。
- ALLOW-FROM uri,允许指定的uri对这一页进行框架化。同样的问题,由于并非所有浏览器都支持此选项,如果浏览器不支持它就会失效。
其他浏览器支持新的CSP frame-ancestors指令。一些浏览器同时支持两者。
落地:
在页面中添X-Frame-Options HTTP响应头。一种方法是手动向每个页面添加HTTP响应头。更简单的方法是实现一个过滤器,自动向每个页面添加头部,或者在Web应用程序防火墙或Web/应用程序服务器添加。
常见防御错误
尝试应用X-Frame-Options指令的Meta标签无效。例如,<meta http-equiv="X-Frame-Options" content="deny">将无效。您必须按照上述描述将X-FRAME-OPTIONS指令作为HTTP响应头应用。
限制
- 每页策略指定:需要为每个页面指定策略,部署起来会较为复杂。如果在登录时为整个站点提供执行(一体化解决方案)
- 多域名站点问题:当前实现不允许网站管理员提供被允许框架页面的域名列表。虽然列出允许的域名是不安全的,在某些情况下,网站管理员只能使用多个主机名。(国内的IT基建,dddd)
- ALLOW-FROM浏览器支持:ALLOW-FROM选项是相对较新增加的,可能不是所有浏览器都支持。依赖ALLOW-FROM时要谨慎。如果应用了以后但是浏览器不支持,等于无效
- 不支持多个选项:没有办法允许当前站点和第三方站点框架化相同的响应。浏览器只接受一个X-Frame-Options头部,并且只接受该头部上的一个值。
- 嵌套框架与SAMEORIGIN和ALLOW-FROM不兼容
3.X-Frame-Options弃用
虽然X-Frame-Options头部得到主流浏览器的支持,但它从未被标准化,并已弃用,转而支持CSP Level 2规范中的frame-ancestors指令。
代理
Web代理可以添加和剥离请求头,如果Web代理剥离了X-Frame-Options头部,那么站点就会失去其框架保护。
使用SameSite Cookies进行防御
在RFC 6265bis中定义的SameSite cookie属性主要旨在防御跨站请求伪造(CSRF);但是它也可以为Clickjacking攻击提供保护。
限制
如果Clickjacking攻击不需要用户进行身份验证,此属性将不提供任何保护。此外,尽管SameSite属性得到了大多数现代浏览器的支持,但仍有一些浏览器不支持。一般来说可以将此属性的使用视为深度防御方法的一部分,而不应依赖它作为唯一的Clickjacking防护措施。
使用window.confirm()进行保护
使用X-Frame-Options或框架破坏脚本是更可靠的点击劫持防御措施。但是在内容必须可框架化的情况下,可以使用window.confirm()来帮助减轻Clickjacking,通过告知用户他们即将执行的操作。
调用window.confirm()将显示一个无法框架化的弹出窗口。如果window.confirm()来自与父级不同域的iframe,则对话框将显示window.confirm()来源的域。在这种情况下,浏览器显示对话框的来源,以帮助减轻Clickjacking攻击。Internet Explorer是唯一已知不显示window.confirm()对话框来源域的浏览器,要解决与Internet Explorer的这个问题,请确保对话框中的消息包含有关正在执行的操作类型的上下文信息
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)