VAmPI 漏洞 API 實戰:初學者如何進行 API 安全測試與漏洞檢測

Published on: | Last updated:

今天要來聊聊 VAmPI。嗯,它是一個… 故意寫得很爛的 API,專門用來練習 API 安全測試。算是一個靶機吧,可以讓你合法地搞破壞,去理解一個 API 到底能怎麼被玩壞。

我自己是覺得,這東西不只是給想做滲透測試的人玩,如果你是開發者,花點時間玩一下,會對你寫出更安全的 Code 很有幫助。你會知道,原來一個小疏忽,後果會這麼嚴重。

重點一句話

簡單講,VAmPI 就是一個 API 安全的練功房,它把 OWASP API Top 10 的經典漏洞都做出來了,讓你在一個安全的環境裡,實際體驗駭客是怎麼思考和攻擊的。

環境設定:先把靶場架起來

這個很簡單,前提是你要有 Docker。有 Docker 的話,一行指令就搞定了。

sudo docker run -d -e vulnerable=1 -e tokentimetolive=18000 -p 5000:5000 erev0s/vampi:latest

這行指令就是… 啟動 VAmPI,然後把它放在背景執行(-d),最重要的是 `-e vulnerable=1`,確保所有漏洞都是開啟狀態。然後把服務開在 port 5000。

跑起來之後,我習慣用 `curl` 測試一下它是不是真的活著。

curl http://localhost:5000

有看到 JSON 回應,就表示成功了。可以開始了。

API 偵察與探測的流程概念
API 偵察與探測的流程概念

所以,到底找到哪些洞?

環境好了,接下來就是好玩的部分。我沒有照順序,大概就是想到什麼就試什麼。這邊記錄幾個比較經典的。

BOLA:你的就是我的,不分你我

BOLA,全名叫 Broken Object Level Authorization,物件層級授權破損。這在 OWASP API 風險清單上排第一名,不是沒原因的,因為它真的太常見了。

白話講就是,系統只檢查你「有沒有登入」,卻沒檢查「這東西是不是你的」。

  • 我先用 `edward` 這個帳號登入,新增一本書,書名叫 "My Secret Book",裡面寫了一些秘密。
  • 然後,我登出,改用另一個帳號 `sam` 登入。
  • 理論上,`sam` 應該看不到 `edward` 的書,對吧?
  • 結果我直接去猜 URL... `GET /books/v1/My%20Secret%20Book`,伺服器就把 `edward` 的秘密內容給我了。完全沒擋。

這問題超大。想像一下,購物網站的訂單、社群網站的私人訊息… 只要猜對 ID,就能看到別人的資料。

Mass Assignment:我自己幫自己加權限

這個也很好笑,叫「巨量指派」。通常發生在註冊或更新資料的時候。

我去看註冊 API (`/users/v1/register`),它需要你傳 `username`, `password`, `email`。但我就手癢,多加一個欄位上去:

{
  "username": "eviladmin",
  "email": "evil@vampi.local",
  "password": "hunter2",
  "admin": true
}

我多送了一個 `"admin": true` 給它。一個設計良好的後端,應該要忽略這個它不認識、或不該由使用者設定的欄位。結果… VAmPI 就照單全收了。我就這樣創造出一個有管理員權限的帳號。這就是開發者懶惰,直接把整個 JSON 物件對應到資料庫模型會發生的慘劇。

偽造 JWT Token 繞過身份驗證
偽造 JWT Token 繞過身份驗證

JWT 偽造:你的 Token 不只是你的 Token

VAmPI 用 JWT (JSON Web Token) 來做身份驗證。登入後,你會拿到一長串的 token。我把這串 token 拿去 jwt.io 這種網站解碼,發現它的加密演算法是 `HS256`。

HS256 是對稱加密,意思是簽名和驗證用的是同一把「秘密鑰匙」。如果這把鑰匙被猜到… 那就完蛋了。

很多開發環境,為了方便,都會用很弱的鑰匙,像是 `"secret"`, `"123456"` 之類的。我就賭它用 `"secret"`。

用 Python 的 `PyJWT` 函式庫,自己簽發一個給 `admin` 帳號的 token,鑰匙就用 `"secret"`。結果… 登入成功。我變成了 admin,可以存取所有受保護的資源。這說明,JWT 的安全性,完全取決於那把鑰匙的強度,還有後端有沒有好好驗證。

SQL Injection:都 2024 了還有這個

對,就是 SQL 資料隱碼攻擊。老掉牙但還是超有效。

我發現有個端點是 `GET /users/v1/{username}`。很明顯,它是把使用者名稱直接拼到 SQL 查詢裡。我在 username 的地方塞了一個單引號 `'`,伺服器就回我 `500 Internal Server Error`。這是一個非常強烈的信號,表示後端資料庫被我的輸入搞混了。

接下來就不用手動了,直接開 `sqlmap` 這個自動化工具。指令大概長這樣:

sqlmap -u "http://localhost:5000/users/v1/*" --headers="Authorization: Bearer <你的JWT>" --dump

然後… 就等著看它把整個資料庫的內容,使用者帳號、密碼(而且還是明文)、書本的秘密,全部倒出來。真的是一覽無遺。

SQL Injection 成功後的資料外洩示意
SQL Injection 成功後的資料外洩示意

漏洞排個優先級看看

老實說,找到一堆漏洞,如果都要修,開發者會瘋掉。所以通常要排個優先級。我自己是覺得可以這樣看:

漏洞類型 攻擊難度 / 普遍性 造成的衝擊
BOLA (權限繞過) 很低。只要有帳號,到處亂試 ID 就有機會。超級常見。 高。可以直接偷看別人的個資,訂單、訊息什麼的。
Mass Assignment (特權提升) 也很低。註冊時多塞個欄位而已,猜對欄位名就行。 嚴重。如果能把自己變成 admin,那基本上就是拿下整台主機了。
SQL Injection (資料隱碼) 中等。需要找到注入點,而且現在很多框架會自動防禦。但一但找到,就… 毀滅性的。整個資料庫被看光光,甚至被刪除或修改。
JWT 弱金鑰 (偽造身份) 難度不一定。完全取決於能不能猜到或偷到那把 secret key。但如果用的是預設弱密碼,那難度就是零。 嚴重。跟 Mass Assignment 差不多,可以直接偽裝成任何人,包括管理員。

一些常見的誤解

玩完 VAmPI 後,有幾個想法,我覺得可以釐清一下。

首先,API 安全不只是滲透測試人員的事。如果你是開發者,這些漏洞幾乎都是「設計或實作階段」的疏忽造成的。與其等著被駭客打,不如一開始就養成好習慣。例如,更新資料時,不要整個物件丟進去更新,要明確指定哪些欄位可以被使用者修改。

再來,OWASP Top 10 是一個很棒的起點。不過呢,這只是個全球性的指南。像在台灣,如果你服務的對象是政府機關或關鍵基礎設施,那你還要考慮到《資通安全管理法》的要求。這時候,發現漏洞不只是「修好就好」,還可能牽涉到通報、鑑識等法律流程。這點跟我們在國外論壇看到的情況很不一樣,法規的壓力會讓整個處理方式完全不同。

最後,不要以為用了很潮的框架就安全了。框架能幫你擋掉一些像 SQL Injection 的基本攻擊,但沒辦法解決 BOLA 這種邏輯上的漏洞。權限控管,終究還是要靠開發者自己去仔細思考和實作的。

總之,花點時間玩玩 VAmPI 或類似的靶機,真的會讓你對 API 安全有更深的體悟。不是看文章,而是親手把它打穿的那種感覺。


討論一下:看完這幾個漏洞,如果你是開發者,你會覺得哪個最可怕,最想優先防堵?是 BOLA 還是 Mass Assignment?在下面留言聊聊你的看法吧。

Related to this topic:

Comments

  1. profile
    Guest 2025-09-05 Reply
    學長,這份API安全教學太狂了!想請教一下,我剛接觸滲透測試,對於實驗環境的建置還有點懵。可以分享更多關於VAmPI的細節嗎?感覺好刺激喔!
  2. profile
    Guest 2025-08-30 Reply
    我想跟團隊爭取資安實驗預算!這份VAmPI指南超級實在,感覺可以當內部培訓教材。老闆,我們真的需要更多實戰演練,不然等被攻擊就慘了...
  3. profile
    Guest 2025-07-28 Reply
    老師,這份教學是不是有點太血腥了?雖然我很好奇API安全,但感覺像是在教人怎麼入侵系統耶。不過,學習滲透測試好像也蠻酷的,就是希望不要誤導新手走上不歸路...
  4. profile
    Guest 2025-06-28 Reply
    老師,這份API安全教學好兇!想請教一下,我對BOLA和JWT這些漏洞還不太熟,可以多聊聊嗎?感覺好像很有趣的資安實驗欸~