SQL 注入

SQL 注入利用了未能驗證使用者輸入的 Web 應用程式。駭客可以透過 Web 應用程式惡意傳遞 SQL 命令,由後端資料庫執行。

SQL 注入可以未經授權訪問資料庫或直接從資料庫檢索資訊。許多資料洩露都是由 SQL 注入造成的。

Pie chart of most common vulnerabilities: SQL Injection is responsible for 50% of vulnerabilities, Cross Site Scripting is responsible for 42% of vulnerabilities, Source Code Disclosure is responsible for 7% of vulnerabilities.

原始來源

工作原理

Screenshot of the login form with username and password fields

輸入使用者名稱和密碼後,在 GUI 背後,SQL 查詢的工作方式如下

sql
"SELECT Count(*) FROM Users WHERE Username=' " + txt.User.Text+" ' AND Password=' "+ txt.Password.Text+" ' ";

現在假設使用者輸入使用者名稱:admin 和密碼:passwd123,所以點選登入按鈕後,SQL 查詢將如下執行

sql
"SELECT Count(*) FROM Users WHERE Username=' admin ' AND Password=' passwd123 ' ";

如果憑據正確,則允許使用者登入,因此這是一種非常簡單(因此不安全)的機制。駭客利用這種不安全性來獲得未經授權的訪問。

駭客使用一個稱為“魔法字串”的簡單字串,例如

使用者名稱:admin

密碼:anything 'or'1'='1

點選登入按鈕後,SQL 查詢將如下工作

sql
"SELECT Count(*) FROM Users WHERE Username=' admin ' AND Password=' anything 'or'1'='1 ' ";

請仔細檢視上述查詢的密碼部分。

Password=' anything 'or'1'='1 '

密碼不是“anything”,因此 password=anything 的結果是 FALSE,但“1”='1' 是一個 TRUE 語句,因此返回 TRUE 值。最後,由於 OR 運算子,值 (FALSE OR TRUE) 為 TRUE,因此身份驗證成功繞過。僅僅由於一個簡單的字串(魔法字串),整個資料庫就被攻破了。

如何預防

在執行使用者憑據查詢之前,進行如下更改

php
$id = $_GET["id"]

(1) $id = stripslashes($id)

(2) $id = mysql_real_escape_String($id)

因此,由於 (1) 輸入字串中的每個單引號 (') 都被替換為雙引號 ("),並且由於 (2) 在每個 (') 之前添加了 (/)。修改後的魔法字串無法繞過身份驗證,您的資料庫保持安全。

另見