SQL 資料隱碼攻擊 SQL injection

Structured Query Language(SQL)常使用於 database 系統中,包括 Microsoft SQL server、Oracle、MySQL、Microsoft Access等,透過 SQL 語法對於資料的儲存、擷取、連結、備份等等皆十分方便,常見使用於倉管、電子商務系統等。然而在 SQL 語法中常會出現攻擊者可以透過更改語法邏輯或加入特殊指令的方式,在未設定過濾惡意程式碼的情況下,資料庫伺服器(DataBase)會直接接收使用者所輸入的 SQL 指令並執行攻擊代碼,使攻擊者能夠取得最高權限,得以擅自竊取、修改、挪動或刪除資料的可能。此類漏洞無疑的會對公司或商號造成相當大的損傷。
舉例而言:
若今天我們透過 ASP 語法去組成 SQL Query statement 以供訪問者作產品查詢,範例語法如下
sql_query = "SELECT ProductName, ProductDescription FROM Products WHERE ProductNumber = " & Request.QueryString("ProductID")
其中 SELECT ProductName, ProductDescription FROM Products 表示從
而 WHERE ProductNumber = " & Request.QueryString("ProductID") 則是當產品編號(ProductNumber)會從取值並列出符合該值的 ProductName 與 ProductDescription。
其中
屬於一種相當常見的 SQL Query statement。
Products 列表(Table)中列舉出 產品名稱(ProductName)與產品描述(ProductDescription)兩個 Columns 的內容。而 WHERE ProductNumber = " & Request.QueryString("ProductID") 則是當產品編號(ProductNumber)會從取值並列出符合該值的 ProductName 與 ProductDescription。
其中
& Request.QueryString("ProductID")是 ASP 語法,取值後接到 ProductNumber =後面。屬於一種相當常見的 SQL Query statement。
範例 URL 如下:
http://www.mydomain.com/products/products.asp?productid=123
假設擷取產品編號為
123 的產品,則上面的 Query statement 將會變成SELECT ProductName, ProductDescription FROM Products WHERE ProductNumber = 123
以列出產品編號為
123 之產品名稱及描述。
但若是將網址改為
http://www.mydomain.com/products/products.asp?productid=123 or 1=1
由於條件式 1=1 恆正,則會讓
Products Table 中所有的產品名稱及描述通通都列出來。
以上的範例僅僅是列出產品清單,其實較無傷大雅。以下將整理三種較常見的 SQL injection 攻擊手法。
三種較常見的 SQL injection 攻擊手法:
- Authorization Bypass(略過權限檢查)
- Injecting SQL Sub-Statements into SQL Queries(注入 SQL 子語法)
- Exploiting Stored Procedures(利用預存程序)
1. Authorization Bypass:
與上面範例的內容相似,假設今天有一段 Query statement 要求使用者輸入帳號及密碼,如下。
"SELECT * FROM customers WHERE name =' -name- ' AND password = ' -password-'
statment 中有兩個 input 值
name 與 password,會有兩個可供使用者輸入值的方塊,但是有心的攻擊者當然不會乖乖的輸入帳號及密碼囉!!透過在' -name- '所對應的方塊內輸入'OR 1=1 --
其中
| 語法 | 意義 |
|---|---|
| ' | 是將 name 的 input 方塊內容關閉 |
| OR | 是指或是的條件 |
| 1=1 | 恆正 |
| -- | 將後方接著的內容註解化 |
會使得 Query statement 變為
"SELECT * FROM customers WHERE name =''OR 1=1
後段
-- AND password = ' -password-' 變成 Comment 後將不被執行,而前段條件式因加入了 OR 1=1 使得攻擊者可以在不被驗證帳號密碼前提下登入 DataBase。


2. Injecting SQL Sub-Statements into SQL Queries:
攻擊者可以在注入惡意的 SQL 的語法去改變資料庫,如在本文一開始的範例中,加入一段 malicious commands
http://www.mydomain.com/products/products.asp?productid=123; DROP TABLE Products
在上面的 URL 中在
productid=123 後面加上一個分號 ;,並加上 DROP TABLE Products 這個 sub command會命令 SQL server 將 Products 這個 Table 刪除掉。
或是進一步去探索其他 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 呈現出來,以竊取資料庫中存放的所有使用者的帳號密碼,有沒有很可怕呀!!
3. Exploiting Stored Procedures:
Stored Procedures(預存程序)是將又臭又長又常用的 SQL 語法寫成一組程序並儲存起來,以供後續呼叫相同程序時不必再將完整個 SQL 語法重打一次,攻擊者亦可透過呼叫這些 Stored Procedures 進而對 DataBase 進行攻擊,如下:
SomeAsp.asp?city=pune';EXEC master.dbo.xp_cmdshell' cmd.exe dir c:
透過 EXEC 去執行
master.dbo.xp_cmdshell 這個預存程序,並帶一參數 cmd.exe dir c: 代表想讓預存程序執行的內容。
想想看,若是攻擊者在某一天將某些公司資料庫中某項產品的價格調為 0 元,竄改政府機關資料庫報稅資料或是將某大廠物料庫存清單刪除,這損失會有多慘重。
如何防範:
- 使用 Regular expression 驗證過濾輸入值與參數中惡意代碼,將輸入值中的單引號置換為雙引號。
- 限制輸入字元格式並檢查輸入長度。
- 資料庫設定使用者帳號權限,限制某些管道使用者無法作資料庫存取。
希望有興趣的讀者也能夠點個追蹤,有任何問題或有想多了解的地方也可以回覆在文章底下唷,謝謝你們XDDDD!
參考來源:
Microsoft MSDN https://msdn.microsoft.com/zh-tw/library/ms175046.aspx
Microsoft technet https://technet.microsoft.com/library/aa991542
teamshatter sql-injection http://www.teamshatter.com/topics/general/team-shatter-exclusive/sql-injections-in-stored-procedures/
Microsoft MSDN https://msdn.microsoft.com/zh-tw/library/ms175046.aspx
Microsoft technet https://technet.microsoft.com/library/aa991542
teamshatter sql-injection http://www.teamshatter.com/topics/general/team-shatter-exclusive/sql-injections-in-stored-procedures/
出處:https://ithelp.ithome.com.tw/articles/10189201
留言
張貼留言