SQL注入安全防禦刻不容緩!駭客常利用未驗證的使用者輸入修改SQL指令,造成敏感資料外洩。本文深度解析 Blind 等常見攻擊方式,並提供參數化查詢、白名單輸入與最低權限原則等關鍵防禦方式。


SQL Injection 是一種 Web 安全漏洞,攻擊者利用未經驗證的使用者輸入,輸入任意資料或修改SQL指令對資料庫進行惡意攻擊,導致後端資料庫執行指令時,傳回非預期的結果(例:敏感資料)。


一、常見的SQL Injection攻擊方式

(一)Error based Injection:

攻擊者向資料庫發送一些惡意查詢,從而導致錯誤


例如:

1、使用註解行(--)使資料庫忽略有效查詢的一部分。

Select * from users where username = ‘jack’ or 1=1-- (此後的所有內容都將被忽略)

2、在查詢中建立始終為TRUE的條件,例如 '1' = '1' 'a' = 'a' 等

Select * from users where username=’jack’ or ‘a’=’a’ -- and password=’pass’


(二)Union Based SQL injection:

將多筆查詢的結果藉由UNION語法合併到單次查詢中,查詢原本不提供的資訊。


例如:

SELECT name, description FROM products WHERE category = 'Gifts'

攻擊者可以輸入:

' UNION SELECT username, password FROM users--

這會傳回所有使用者名稱和密碼以及產品的名稱和描述。


(三)Blind SQL injection:

只有正確的查詢才會顯示結果,錯誤的查詢不會回傳任何內容。攻擊者應該嘗試產生邏輯上正確的查詢。

Blind SQL injection有兩種類型是基於Boolean-based和Time-Based。


1、Boolean-based Injection:

是一種推理 SQL 注入技術,向資料庫發送 SQL 查詢,強制應用程式根據查詢傳回的是 TRUE 還是 FALSE 結果來傳回不同的結果。

2、Time-Based Injection:

攻擊者發送特定的 SQL 查詢,強制資料庫「睡眠」或暫停指定時間,利用 SQL Injection 造成查詢時的時間延遲,透過時間差來洩漏資料庫中的資料。


二、SQL Injection 範例

登入畫面中,使用者名稱和密碼是使用者輸入資料的欄位。根據使用者的輸入,將建立查詢


SQL Injection 範例


通常的查詢是

Select * from USERS where username=’username’ and password=’password’.

攻擊者可以在password欄位輸入 ‘ OR 1=1-- ,就不需要使用密碼也能登入了

查詢語句會變成:

Select * from USERS where username=’admin’ and password=’’ OR 1=1--’


三、解決方式

使用參數化查詢,原理是資料庫語法中的佔位符號,將佔位符號的功能弄成預處理的 SQL 語句,資料庫會先   將 SQL 語句進行編譯,之後再把使用者輸入的參數進行編譯後的 SQL 語句再執行。

SELECT * FROM USERS WHERE username = $1 AND password = $2 這樣的參數不會被當作SQL語法去執行,因此就算使用者輸入的參數有不當的指令也不會執行成功。


四、常見SQL Injection攻擊流程


SQL Injection攻擊流程


(一)綠色為正常web流程

(二)藍色字為不可更改,只能改橘色部分

(三)只要是文字都可以Injection,需要compiler的不容易Injection


五、防禦方式

(一)參數化查詢:

事先定義所有的SQL 代碼為不同的參數,並限制使用參數進行SQL 查詢

(二)白名單輸入:

只允許特定的數值輸入欄位

(三)限制轉義參數:

檢查使用者輸入的內容,將SQL 代碼替換成其他字元,強烈建議不要轉義所有使用者提供的輸入

(四)低權限原則:

限制SQL 指令的範圍,降低SQL指令可執行的動作

有任何資安問題,歡迎隨時與NEITHNET團隊聯繫!

參考資料:

1.https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html

2.https://zh.wikipedia.org/zh-tw/SQL%E6%B3%A8%E5%85%A5

3.https://www.greycampus.com/opencampus/ethical-hacking/types-of-sql-injection

4.https://portswigger.net/web-security/sql-injection#how-to-prevent-sql-injection