一、什麼是SQL注入
SQL注入是指攻擊者通過輸入非法的SQL語句,從而進入系統的資料庫中,從而控制可執行的SQL語句。如果攻擊者成功利用SQL注入,他們可以從資料庫中獲取數據,修改數據,刪除數據,甚至將安全信息泄露給惡意攻擊者。
DVWA(Damn Vulnerable Web Application)是一款供安全工作者練習漏洞利用技能的Web應用程序。在不同難度等級的DVWA中,均提供了SQL注入漏洞。
例如,以下程序是用於驗證用戶是否輸入了正確的用戶名和密碼。 if($username && $password){ $sql = "SELECT * FROM Users WHERE username='$username' AND password='$password'"; $result = mysql_query($sql); $count = mysql_num_rows($result); if($count >= 1){ echo "登錄成功!"; }else{ echo "登錄失敗!"; } }
如果黑客試圖通過輸入以下內容來嘗試利用SQL注入攻擊:
$uname = "admin' -- "; $upass = "password";
觀察SQL語句,將發現用戶名輸入的”admin’ — “是包含注釋語句的字元串,該注釋語句會將密碼輸入參數去掉。因此這個SQL語句將執行如下查詢:
SELECT * FROM Users WHERE username='admin' -- ' AND password='password'
而對於注釋後的字元串「’ AND password=’password’」,則會被忽略,這樣攻擊者便利用SQL注入攻擊成功繞過了登錄驗證,進入系統。
二、DVWA上的SQL注入漏洞
1、低等級漏洞
在DVWA中,低等級的SQL注入存在於以下代碼片段中:
$id = $_GET['id']; ... $sql = "SELECT * FROM User WHERE id='$id'"; ...
上述代碼首先獲取來自GET參數中的id值,然後使用該id值進行SQL查詢操作。黑客可以通過URL注入以下字元串,從而利用SQL漏洞實現攻擊:http://example.com/vulnerabilities/sqli?id=1′ OR true —
這樣注入的SQL查詢語句中的邏輯將被改變,$sql將被更新為:
SELECT * FROM User WHERE id='1' OR true -- '
將”OR true –“的注釋使查詢不屬於AND條件,”OR true”將使SELECT語句返回所有記錄,因此注入者將獲得對數據表中所有用戶的訪問權。
2、中等等級漏洞
中等等級SQL注入漏洞示例:
$id = $_GET['id']; ... $sql = "SELECT * FROM User WHERE id=$id"; ...
在這個漏洞中,攻擊者可以通過輸入以下字元串繞過SQL轉義:
?id=1%27%20or%20%271%27%3d%271
在這個例子中,「%27」等於單引號的UTF-8編碼,因此在輸入id=1′ or ‘1’=’1時無法通過轉義符進行阻止。這種攻擊方式被稱為數字型注入。
3、高等級漏洞
高等級SQL注入漏洞示例:
$search = $_REQUEST['search']; ... $sql = "SELECT * FROM user WHERE first_name LIKE '%$search%'"; $rs = mysql_query($sql); ...
在這個漏洞中,攻擊者可以通過在搜索框中輸入以下字元繞過SQL查詢:
' UNION SELECT table_schema, table_name FROM information_schema.tables --
這個攻擊將使查詢如下:
SELECT * FROM user WHERE first_name LIKE '%' UNION SELECT table_schema, table_name FROM information_schema.tables -- '%'
UNION SELECT 將會顯示另一個表或資料庫的結果。在這個例子中,我們查詢在信息架構中的表格並將結果與另一個查詢連接起來。
三、如何防止SQL注入攻擊
以下提供了幾種避免SQL注入漏洞的常用方法。
1、使用參數化查詢
參數化查詢是將SQL語句與參數分開,從而避免使用語句拼接造成的漏洞。
$sql = "SELECT * FROM users WHERE username=? AND password=?"; $stmt = $db->prepare($sql); $stmt->bind_param('ss', $username, $password); $stmt->execute();
2、使用白名單
使用白名單來限制應用程序使用者可以使用哪些字元。例如,在輸入用戶名時,我們可以限制不允許輸入分號、單引號、雙引號、括弧等特殊字元。
3、輸入驗證和輸出編碼
在驗證用戶輸入時,可以限制並驗證不允許的字元和數據類型。在輸出時,應用程序可以使用輸出編碼,將HTML標記轉換為它們的編碼形式,以防止惡意腳本被注入到網站上。
4、使用ORM(對象關係映射)
ORM是一個程序庫或編程模式,它通過將資料庫表格與具有相關數據的程序對象相對應來實現數據的集成。它可以自動轉義任何字元串和對象,從而避免了SQL注入漏洞。
結論
SQL注入是一個常見的Web應用程序漏洞。在DVWA中,我們可以在不同難度等級的應用程序中練習SQL注入技巧。因此,在編寫Web應用程序時,需要認真考慮和應對這些威脅。我們可以採用參數化查詢、使用白名單、輸入驗證和輸出編碼、使用ORM等多種方法來防止SQL注入漏洞。
原創文章,作者:ZDSM,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/149984.html