一個 QA 親手打一次 OWASP Juice Shop,學到的六種測試技能

#安全測試 #QA 學習 #QA 思維

一個 QA 親手打一次 OWASP Juice Shop,學到的六種測試技能 目錄 1. 為什麼 QA 要親手打一次靶 2. 先把 Juice Shop 跑起來 3. 六種漏洞,六個帶得走的測試技能 4. 把破關變成你的日常測試 checklist 5. 結尾 為什麼 QA 要親手打一次靶 我之前寫過一篇〈Security Testing 入門:不懂資安的 QA 能做的第一步〉,講的是不需要資安背景也能做的幾個方向。但那篇是「用想的」。 讀十篇 SQL injection 的原理,不如自己在登入框打一次 ' OR 1=1 、看著它真的讓你變成管理員。資安測試的手感,是用手打出來的,不是用眼睛讀出來的。 問題是:你不能拿公司的正式環境練手——那是攻擊,不是測試。 這就是 OWASP Juice Shop 存在的理由。它是 OWASP 官方維護的「故意做爛」的電商網站,裡面塞滿真實漏洞,而且設計成一個闖關遊戲:每破解一個漏洞,系統就幫你記一分。它是 合法、安全、為了練習而生 的靶場。 一句話的職業道德:滲透測試只能打你「被授權」的系統。Juice Shop 跑在你自己機器上,你打的是自己,所以安全。換成任何別人的網站,性質就完全不同了。 對 QA 來說,破 Juice Shop 的價值不是變成 hacker,而是: 把「攻擊者怎麼想」內化成測試直覺 。打完一輪,你看任何功能的眼神都會不一樣。 先把 Juice Shop 跑起來 不用裝一堆東西,有 Docker 的話一行就起來(約 5 分鐘): 打開 http://localhost:3000 就是一個正常的果汁電商。右上角有個記分板,網址是 http://localhost:3000/ /score board——一開始它本身就是一道題(找到它就得分)。 工具只要兩個你本來就有的: 瀏覽器的開發者工具 (看 request、改參數、讀 storage),以及一個能改 HTTP 請求的代理工具(Burp Suite 社群版,或你熟的 Proxyman / mitmproxy)。 接下來不是要你照解答抄一遍——官方解答隨時在那。重點是 先卡關、先自己想 ,想不出來再看。卡關時冒出來的那些假設,才是測試思維在長出來。 六種漏洞,六個帶得走的測試技能 Juice Shop 的關卡是照 OWASP Top 10 的脈絡分類的。挑六類最值得 QA 練的,每一類我同時寫「攻擊怎麼打」和「 它變成你日常的哪一條測試 」。 1. Injection:永遠多送一個特殊字元 關卡 :在登入框的 email 欄輸入 ' OR 1=1 ,密碼隨便打,直接登入成管理員。原理是後端把你的輸入直接拼進 SQL,單引號提前結束字串、OR 1=1 讓條件永遠成立、 把後面註解掉。 QA 學到的 :任何「輸入會被後端拿去做事」的欄位——查詢、搜尋、登入、篩選——都要試特殊字元:'、"、;、 、<、%。不是要你會寫 payload,是養成「這個輸入後端會怎麼解讀?」的反射。輸入驗證測試,從此不再只是測空值和超長字串。 2. Broken Access Control:改一個 ID 就越權 關卡 :登入自己的帳號後看購物車,把 request 裡的 bid(basket id)改成別人的數字,就看到別人的購物車。這叫 IDOR(Insecure Direct Object Reference)——伺服器只檢查「你登入了嗎」,沒檢查「這東西是你的嗎」。 QA 學到的 :這是 QA 最該會、也最容易測的一類。凡是 URL 或 request 裡有 id、uid、orderId 這種識別碼,就試著改成別人的值。能看到不該看的,就是 bug。這條 checklist 不需要任何資安工具,開發者工具就夠——也是我認為 CP 值最高的一招。 3. XSS:把使用者輸入當成程式碼來想 關卡 :在搜尋框輸入 <iframe src="javascript:alert(\xss\)" ,頁面直接把它當 HTML 渲染、彈出視窗。代表使用者的輸入被原封不動塞進畫面,沒有做輸出編碼。 QA 學到的 :凡是「我輸入的東西會顯示在畫面上」的地方——留言、暱稱、搜尋結果、錯誤訊息——都丟一段 <script 或 <img src=x onerror=alert(1) 進去。如果它執行了,就是 XSS。順手也驗了一件功能面的事:輸入有沒有被正確 escape。 4. Broken Authentication:弱密碼與救援流程 關卡 :管理員帳號的密碼是 admin123;有些帳號可以靠「忘記密碼」的安全問題(答案在用戶公開資料裡找得到)被攻破。 QA 學到的 :認證流程不是只測「正確帳密能登入」。要測:弱密碼擋不擋、密碼重設流程能不能被別人走完、安全問題的答案是不是公開可查、登出後 token 還能不能用。這些都是功能測試延伸一步就能做的。 5. Sensitive Data Exposure:找出沒人該看到的東西 關卡 :伺服器上有個被遺忘的備份檔 package.json.bak,透過特製的路徑就能下載;也有藏在 FTP 目錄、註解、回應 header 裡的機密。 QA 學到的 :測試時順手看「 有沒有東西洩漏了不該洩漏的 」:API 回應裡有沒有夾帶多餘欄位(密碼 hash、內部 id)、錯誤訊息有沒有吐出 stack trace、原始碼註解和回應 header 有沒有洩底。資料外洩往往不是被攻破,是自己漏出來的。 6. Security Misconfiguration:翻 main.js 找隱藏後台 關卡 :管理後台 / /administration 沒有連結、但路由真的存在——打開 main.js 搜尋路由表就找得到,而且前端只靠「藏起來」當保護。 QA 學到的 :「使用者看不到」不等於「使用者進不去」。前端隱藏的功能、被 disable 的按鈕、靠前端判斷的權限,全都可以被繞過。測試時養成翻一下前端打包檔、看看有沒有沒接好的後門路由。 把破關變成你的日常測試 checklist 打完上面六類,你其實已經有一份可以貼在螢幕旁的清單了: 輸入欄位 → 試 ' " <script 特殊字元(Injection / XSS) 任何 ID 參數 → 改成別人的值,看會不會越權(Broken Access Control) 登入 / 改密碼 → 弱密碼、重設流程、token 失效(Broken Authentication) API 回應 & 錯誤訊息 → 有沒有多吐欄位、stack trace、機密(Data Exposure) 前端隱藏功能 → 翻打包檔、直接打路由(Misconfiguration) 這份清單最棒的地方是:它 不需要你變成資安專家 ,全部用瀏覽器開發者工具就能跑,而且每一條都能直接塞進你現有的測試流程。這正好呼應我那篇入門文的主張——資安測試的第一步,是把攻擊者的視角變成一條條具體的檢查項。 更進一步,這些 heuristics 值得收進你的測試知識庫。如果你也在用 PARA 整理測試知識,這份清單就是 Resource 抽屜裡最該長期保存的一頁。 結尾 QA 常覺得資安測試是另一個世界、是專家的事。但 Juice Shop 會讓你發現:大部分常見漏洞,測起來跟你每天做的功能測試只差「換一個角度問問題」。把單引號送進去、把 ID 改成別人的、把 <script 貼上去——這些動作的門檻,遠比想像中低。 花一個下午,在自己機器上把這個靶場打一輪。你不會變成滲透測試員,但你會多一雙「攻擊者的眼睛」。而那雙眼睛,會跟著你回到每一次正常的測試裡。 從 docker run 那一行開始就好。 參考資料 1. OWASP Juice Shop 官方專案 — OWASP 維護的刻意脆弱 Web 應用,合法的資安練習靶場 2. OWASP Juice Shop 官方解答附錄 — 所有關卡的分類與解法(卡關再看) 3. OWASP Top 10 — Juice Shop 關卡分類所依據的十大 Web 安全風險 4. Security Testing 入門:不懂資安的 QA 能做的第一步 — 本文的概念前傳