DVWA SQL注入詳解

一、什麼是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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ZDSM的頭像ZDSM
上一篇 2024-11-05 16:54
下一篇 2024-11-05 16:54

相關推薦

  • Hibernate日誌列印sql參數

    本文將從多個方面介紹如何在Hibernate中列印SQL參數。Hibernate作為一種ORM框架,可以通過列印SQL參數方便開發者調試和優化Hibernate應用。 一、通過配置…

    編程 2025-04-29
  • 使用SQL實現select 聚合查詢結果前加序號

    select語句是資料庫中最基礎的命令之一,用於從一個或多個表中檢索數據。常見的聚合函數有:count、sum、avg等。有時候我們需要在查詢結果的前面加上序號,可以使用以下兩種方…

    編程 2025-04-29
  • 理解Mybatis中的SQL Limit用法

    Mybatis是一種非常流行的ORM框架,提供了SQL映射配置文件,可以使用類似於傳統SQL語言的方式編寫SQL語句。其中,SQL的Limit語法是一個非常重要的知識點,能夠實現分…

    編程 2025-04-29
  • SQL預研

    SQL預研是指在進行SQL相關操作前,通過數據分析和理解,確定操作的方法和步驟,從而避免不必要的錯誤和問題。以下從多個角度進行詳細闡述。 一、數據分析 數據分析是SQL預研的第一步…

    編程 2025-04-28
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25
  • 神經網路代碼詳解

    神經網路作為一種人工智慧技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網路的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網路模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web伺服器。nginx是一個高性能的反向代理web伺服器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分散式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25

發表回復

登錄後才能評論