與前面章節「攻擊者送出惡意輸入」的漏洞不同,應用程式邏輯與設定漏洞來自於開發者本身的決策錯誤:
- Application Logic Vulnerability:開發者在程式邏輯上犯錯,攻擊者藉此執行非預期動作
- Configuration Vulnerability:開發者錯設工具、框架、第三方服務或第三方套件的設定
這類漏洞難以找尋,因為沒有固定 payload。需要靠對技術棧、框架預設行為、第三方服務的熟悉度,搭配創造性思考。
引子:Rails 的 Mass Assignment(CVE-2012-2054)#
2012 年 Egor Homakov 向 Rails 團隊回報:Rails 預設配置接受 controller 收到的所有參數直接寫入資料庫物件——任何使用者都能更新本不該由他變動的欄位(user ID、creation date、permissions)。Rails 核心團隊一度認為「應由開發者自行白名單參數」而拒絕修補。
Homakov 隨後直接在 GitHub(用 Rails 寫的)展示攻擊:把自己的 SSH key 加到 GitHub 官方 repo。社群震驚後 Rails 改變預設行為,要求參數必須白名單才會被接受。
這是邏輯/設定漏洞的經典:問題並非單一程式碼錯誤,而是框架預設行為與開發者直覺的落差。
案例 1:Bypassing Shopify Administrator Privileges#
- 難度:低
- URL:
<shop>.myshopify.com/admin/mobile_devices.json- 回報來源:https://hackerone.com/reports/100938/ ↗
- 回報日期:2015-11-22
- 獎金:$500
漏洞描述#
Shopify 用 Rails 寫成;Rails 不內建權限管理,需開發者自行處理。研究者 rms 發現 Shopify 的「Settings」權限只藏掉前端輸入欄位,後端 API /admin/mobile_numbers.json 並未檢查權限。流程:
- 用有 Settings 權限的帳號加電話、用 Burp 紀錄請求
- 回收該權限
- 透過 Burp Repeater 重發同一請求 → 仍成功新增電話號碼
- 下單後通知簡訊真的寄出 → 漏洞確認
Takeaways#
對 Rails 站台永遠完整測試權限模型。前端隱藏的按鈕/欄位常代表後端可能沒檢查——用代理工具重發請求是最快驗證方法。
案例 2:Bypassing Twitter Account Protections#
- 難度:易
- URL:
https://twitter.com- 回報日期:2016 年 10 月
- 獎金:$560
漏洞描述#
Twitter 在「陌生 IP 與瀏覽器」首次登入時,會要求補充 Email 或電話。研究者 Aaron Ullger 連 VPN 換 IP 後在手機 App 登入——竟然不需補充驗證。攻擊者一旦取得帳密,可避開額外驗證並從 App 中讀到 Email/電話,再回過頭從網站登入。
Takeaways#
安全機制要看所有平台是否一致——網站、行動 App、API、第三方整合都應強制相同檢查。
案例 3:HackerOne Signal Manipulation#
- 難度:低
- URL:
hackerone.com/reports/<X>- 回報來源:https://hackerone.com/reports/106305 ↗
- 回報日期:2015-12-21
- 獎金:$500
漏洞描述#
HackerOne 推出「Signal」分數計算研究者 reputation:
| 結案類型 | 分數 |
|---|---|
| spam | -10 |
| not applicable | -5 |
| informative | 0 |
| resolved | 7 |
研究者 Ashish Padelkar 發現「自我關閉(self-close)」功能會把報告計為 0——但 HackerOne 仍把它納入 Signal 平均。負分使用者只要瘋狂自關報告,就能把 Signal 拉回 0。
Takeaways#
注意「新功能與舊功能的交集」。本案的 Signal 計算邏輯與既有 self-close 功能互動產生瑕疵——新功能上線是測試的好時機。
案例 4:HackerOne Incorrect S3 Bucket Permissions#
- 難度:中
- URL:
[REDACTED].s3.amazonaws.com- 回報來源:https://hackerone.com/reports/128088/ ↗
- 回報日期:2016-04-03
- 獎金:$2,500
漏洞描述#
作者本人從 Shopify 的舊報告聯想到:S3 Bucket 權限設定複雜(read/write/read-write),常被錯設。HackerOne 圖檔由 hackerone-profile-photos 提供,他用 bucket_finder
↗ 列舉常見 bucket 名(hackerone.marketing、hackerone.files 等)。
bucket_finder 預設只測讀取,所以作者另用 AWS CLI 試寫入:
$ aws s3 mv test.txt s3://hackerone.marketing
move failed: ... Access Denied
$ aws s3 mv test.txt s3://hackerone.files
move: ./test.txt to s3://hackerone.files/test.txt ← 成功hackerone.files 對任何 AWS 帳號可寫——攻擊者可放惡意檔案誘騙員工取用。Hackerone 數小時內修復並把同類錯設一併處理,連帶提高了賞金。
Takeaways#
- 看到別人的舊報告就研究他們怎麼找的——多半是好線索
- S3 不只測讀取,還要測寫入/刪除
- 連 HackerOne 自己都會出錯——別因目標公司資安強而退卻
案例 5:Bypassing GitLab Two-Factor Authentication#
- 難度:中
- 回報來源:https://hackerone.com/reports/128085/ ↗
- 回報日期:2016-04-03
- 獎金:N/A
漏洞描述#
研究者 Jobert Abma 發現 GitLab 在 2FA 第二步驟的 POST 請求允許夾帶任意 user[login]:
POST /users/sign_in HTTP/1.1
...
Content-Disposition: form-data; name="user[otp_attempt]"
212421
----------1881604860
Content-Disposition: form-data; name="user[login]"
johnGitLab 看到 user[login]=john 會以 john 帳號的身份產生並驗證 OTP。即使攻擊者不知道 john 的密碼,只需正確輸入或猜中 OTP就能登入。
限制:OTP 30 秒輪替且需真有人在嘗試登入,實務上不易利用。但仍違反 2FA 設計原則——GitLab 兩天內修復。
Takeaways#
2FA 系統實作易出錯,重點檢查:
- Token 有效期
- 嘗試次數限制
- 過期 Token 是否可重用
- 是否能用 HTTP 參數重新指定使用者
案例 6:Yahoo! PHP Info Disclosure#
- 難度:中
- URL:
http://nc10.n9323.mail.ne1.yahoo.com/phpinfo.php/- 回報來源:https://blog.it-securityguard.com/bugbounty-yahoo-phpinfo-php-disclosure-2/ ↗
- 回報日期:2014-10-16
- 獎金:N/A
漏洞描述#
Patrik Fehrenbach 發現 Yahoo 一台伺服器對外暴露 phpinfo()——洩漏 PHP 設定、HTTP 標頭、環境變數,攻擊者可取得大量內部資訊。
phpinfo()還會顯示httponlyCookie 內容。若同網域有 XSS,可呼叫phpinfoURL 讀回 body 中的 Cookie,繞過httponly防護。
要找這類漏洞需大規模掃網段。Fehrenbach 用 whois 找出 Yahoo 擁有的 IP 區段(98.136.0.0/14,約 26 萬 IP),再用簡單 bash 掃:
#!/bin/bash
for ipa in 98.13{6..9}.{0..255}.{0..255}; do
wget -t 1 -T 5 http://${ipa}/phpinfo.php
done &Takeaways#
計畫範圍若涵蓋整個基礎設施,自動化掃描是必要技能。手動測 26 萬個 IP 不可能完成。
案例 7:HackerOne Hacktivity Voting#
- 難度:中
- URL:
https://hackerone.com/hacktivity/- 回報來源:https://hackerone.com/reports/137503/ ↗
- 回報日期:2016-05-10
- 獎金:紀念品(Swag)
漏洞描述#
HackerOne 用 React,UI 元件依伺服器回應決定是否啟用。研究者 apok 用 Burp 把回應中的 false 全部改成 true——出現原本被隱藏的「投票」按鈕,可實際 POST 投票。
更直接的找法是搜尋 JS 檔中的 POST:
vote: function() {
a.ajax({
url: this.url() + "/votes",
method: "POST",
...
});
}Takeaways#
對 React/Angular/Vue 等框架的站點,搜尋 JS 檔中的 endpoint 能找到尚未在 UI 上線的功能。可使用 JSParser ↗ 追蹤 JS 變化。
案例 8:Accessing PornHub’s Memcache Installation#
- 難度:中
- URL:
stage.pornhub.com- 回報來源:https://blog.zsec.uk/pwning-pornhub/ ↗
- 回報日期:2016-03-01
- 獎金:$2,500
漏洞描述#
PornHub 範圍是 *.pornhub.com。Andy Gill 用子網域字典找到 90 個子網域,再用 EyeWitness 自動截圖快速篩選。鎖定 stage.pornhub.com(測試/開發環境最易出包),用 nmap -sV -p- 掃所有埠:
PORT STATE SERVICE VERSION
80/tcp open http nginx
443/tcp open http nginx
60893/tcp open memcacheMemcache 暴露在外是大紅旗——它的官方安裝指引建議不應對外開放。Gill 用 Netcat 連入,未要求認證即可執行 stats、version,確認失誤。
Memcache 的危險程度取決於它快取了什麼資料。若快取 session 或敏感欄位,影響可能大幅提升。
Takeaways#
子網域列舉 + 大範圍埠掃描 + 自動截圖 = 找應用設定漏洞的標配三步驟。學會 EyeWitness ↗、Nmap ↗ 是值得的投資。
章末總結#
- 邏輯/設定漏洞不靠 payload,靠理解技術細節與換角度測試
- 高 CP 值切入點:
- 框架預設配置(Rails mass assignment、Django
DEBUG=True) - 跨平台(Web / Mobile / API)的安全行為差異
- 第三方服務(S3、Memcache、Redis)的權限/公開設定
- 子網域大範圍掃描
- JavaScript 中的隱藏 endpoint
- 新功能與舊功能交集
- 框架預設配置(Rails mass assignment、Django
- 工具技能:Burp Suite、bucket_finder、AWS CLI、Nmap、EyeWitness、JSParser、自寫 bash/Python 腳本