SQL注入實戰篇

 

今天要介紹的是SQL注入實驗。SQL注入***的學習,咱們更多的目的是爲了學習***技術和防範策略,而不是刻意去***數據庫。程序員

首先咱們先進入實驗地址《SQL 注入》正則表達式

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

對於注入漏洞來講,可能如今不少人認爲它已通過時,由於這種漏洞能夠被參數化查詢而杜絕。之前對這種漏洞的防護方式主要有三種:數據庫

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

字符串替換:把危險字符替換成其餘字符,缺點是危險字符可能有不少,一一枚舉替換至關麻煩,也可能有漏網之魚。ide

存儲過程:把參數傳到存儲過程進行處理,但並非全部數據庫都支持存儲過程。若是存儲過程當中執行的命令也是經過拼接字符串出來的,仍是會有漏洞。學習

咱們仍是來實踐吧,這樣更好理解。測試

咱們先看一下實驗的大體思路網站

(1)找注入並確認(經典的and 1=1 and1=2)加密

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

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

首先咱們看一下源碼

圖片1.png

這就是這一段sql查詢語句形成了最多見的SQL注入。咱們繼續實驗,此次利用到了dvwa,咱們登陸dvwa而後選擇SQL Injection 底下難度選擇low。

圖片2.png

圖片3.png

圖片4.png

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

ID等於1的時候能夠正常回顯

圖片5.png

And 1=1能夠正常回顯

圖片6.png

And 1=2返回錯誤

圖片7.png

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

爲何這樣就判斷有sql注入了呢?原理是把測試語句代入到了數據庫查詢,and就是邏輯運算,1=1爲真,1=2爲假,因此返回不一樣。

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

圖片8.png

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

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

查詢數據庫等基本信息。

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

圖片9.png

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

查詢表段

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

圖片10.png

查詢列名

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

圖片11.png

查詢用戶名密碼

union select password,user from users

圖片12.png

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

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

1)注入分爲哪幾種類型?分類依據是什麼?是否惟一?

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

本次的實驗就介紹到這裏,注意多加總結和思考課後問題!咱們學習的目的除了瞭解以外,更重要的是學習如何防範SQL注入。在面對SQL注入***的時候,瞭解其原理才能更好的防範。

下面總結幾點防範SQL注入***的要點:

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

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

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

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

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

相關文章
相關標籤/搜索