NEITHNET 情資分享
NEITHNET 資安實驗室
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。
□ Boolean-based Injection:
是一種推理 SQL 注入技術,向資料庫發送 SQL 查詢,強制應用程式根據查詢傳回的是 TRUE 還是 FALSE 結果來傳回不同的結果。
□ Time-Based Injection:
攻擊者發送特定的 SQL 查詢,強制資料庫「睡眠」或暫停指定時間,利用 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攻擊流程
1、綠色為正常web流程
2、藍色字為不可更改,只能改橘色部分
3、只要是文字都可以Injection,需要compiler的不容易Injection
防禦方式
● 參數化查詢:事先定義所有的SQL 代碼為不同的參數,並限制使用參數進行SQL 查詢
● 白名單輸入:只允許特定的數值輸入欄位
● 限制轉義參數:檢查使用者輸入的內容,將SQL 代碼替換成其他字元,強烈建議不要轉義所有使用者提供的輸入
● 最低權限原則:限制SQL 指令的範圍,降低SQL指令可執行的動作
參考來源:
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
更多資安訊息及防護策略,歡迎與NEITHNET資安專家聯繫:info@neithnet.com