SQL 是常見的資料庫語法,
許多網站都使用 SQL 語言來取得資料。
而所謂的 SQL Injection 又被稱為
SQL 注入、SQL 隱碼或 SQL 注碼。
即是駭客透過修改 SQL 語句,
來改變原本的指令內容,
達成竊取/破壞資料的行為,
是一種發生在應用程式與資料庫之間的安全漏洞。
在設計不良的程式中,
若攻擊者在輸入的字串中夾帶 SQL 指令,
而網站又沒有進行字元檢查,
那麼這些夾帶進去的惡意指令,
就會被資料庫伺服器誤認為是
正常的 SQL 指令而被執行,
導致資料庫因此遭到入侵或是破壞。
有部份人認為 SQL 注入只針對 Microsoft SQL Server,但只要是支援處理 SQL 指令的資料庫伺服器,都有可能受到此種手法的攻擊。
假設今天有一段 query statement
要求使用者輸入帳號及密碼如下:
SELECT * FROM customers WHERE name =' -name- ' AND password = ' -password-'
statment 中有兩個參數值-name-
與 -password-
,
這時如果透過 -name-
所對應的 input 輸入
'OR 1=1 --
其中 '
是關閉 name 的 input 內容,
後面接上 OR
表示「或是」的條件,
而 1=1
這個判斷永遠返回 true,
再用 --
將後面的內容變成註解。
以上會使得整個 query statement 變成:
"SELECT * FROM customers WHERE name ='' OR 1=1 -- AND password = ' -password-'
由於註解後面的 AND password = ' -password-'
會直接被略過,
如此一來判斷條件將永遠是 true,
使得攻擊者可以在不需驗證帳號密碼的狀況下
登入 DataBase 取得資料。
攻擊者透過注入惡意的 SQL 的語法去改變資料庫,
比方說以下這段 malicious commands(惡意指令)。
// 瀏覽器送出以下 URL
// http://www.mydomain.com/products/products.asp?productid=123; DROP TABLE Products
// 伺服器會進行以下指令
SELECT ProductName, ProductDescription FROM Products WHERE ProductNumber = 123
DROP TABLE Products
在上面的 URL 在 productid=123
後面加了一個分號 ;
,
再加上 DROP TABLE Products
這個 sub command,
這將會命令 SQL server
將 Products 這個 Table 刪掉。
攻擊者也可以使用其他 query 方法
進一步去探索其他 table 中的資料,
如下方的 SQL query:
http://www.mydomain.com/products/products.asp?productid=123 UNION SELECT Username, Password FROM USERS
其中 UNION
能將兩個 SELECT
的結果
用一個結果集呈現出來,
而第二個 SELECT
是將 USERS
這個 Table 的Username
與 Password
呈現出來,
以竊取資料庫中存放的所有使用者的帳號密碼。
Stored Procedures(預存程序)
是將又臭又長又常用的 SQL 語法
寫成一組程序並儲存起來的一種方法,
方便於後續呼叫相同程序時
不必再將完整個 SQL 語法重打一次。
攻擊者亦可透過呼叫這些 Stored Procedures
進而對 DataBase 進行攻擊,如下:
SomeAsp.asp?city=pune';EXEC master.dbo.xp_cmdshell' cmd.exe dir c:
上面的代碼中,程式收到要執行master.dbo.xp_cmdshell
這個預存程序,
並在後面帶上參數 cmd.exe dir c:
代表想用預存程序執行這個檔案。
若是攻擊者將公司資料庫中
某項產品的價格調為 0 元,
或竄改政府機關資料庫報稅資料,
或是將某大廠物料庫存清單刪除,
不管哪項都將導致被攻擊者極大的損害。