你真的會SQL注入攻擊嗎?(下)
掃描二維碼關注公眾號,不便發在知乎的文章會在公眾號持續更新
專欄被逗逼舉報,禁了一周。所以我無奈之下搞了一個公眾號,見題圖
完成了上章節的練習之後,筆者講解UNION注入大家就會學的更明白了。首先如何判斷注入點,大多數人所說的and 1=1、and 1=2來判斷的確是可以的,但我們更需要明白每一個步驟的原理。
http://xxxx.com/huangou.php?id=5 and 1=1 返回和原來一樣的頁面
http://xxxx.com/huangou.php?id=5 and 1=2 返回空數據的頁面
為什麼會這樣就可以判斷呢?我們來使用Mysql資料庫來查詢試試。Select password from mysql.user where user=』root』 and 1=1;和 and 1=2 試試。如下圖:
是的,正是因為1=1永遠成立,而and是邏輯運算符,必須前後條件成立整個語句才成立,所以進行了輸出SQL語句的結果內容。而1=2是t不成立所以在這裡就沒有輸出任何內容。這進一步說明WEB程序將我們輸入的 and 1=1 帶入了SQL查詢語句中進行查詢,通過返回頁面的不同來判斷。
判斷為SQL注入之後第二步是判斷欄位數,使用order by函數(用於查詢出的結果排序的函數)。通過order by 1 、order by 2……order by 8,都是返回正常頁面,如下圖:
當我們輸入order by 9的時候,突然就返回空數據的頁面了(與and 1=2頁面一樣)。如下圖:
這時候初學者會有兩個疑問:1、為什麼會出現這樣的情況?2、為什麼要這樣做?帶著兩個問題我們來解決,進入Mysql測試一下就會明白了(下圖欄位數不一樣)。
上圖可以很快發現,order by 2這樣的意思是通過欄位數量來進行排序,例如要查詢host、password兩列通過欄位數量排序只有2列,如果使用order by 3則提示未知的欄位數。恩,所以報錯了,沒有把結果顯示出來。
那麼為什麼要去猜欄位數量呢?因為我們將會用到union 函數,我們看看這個函數的說明:
注意劃紅線的地方,通過union連接的兩條SQL語句必須欄位數列一樣。之後我們就可以使用union select 1,2,3,4,6,7,8 來查看這8個欄位中哪幾個欄位位能在網頁中正常顯示的。
從上圖可以發現,8個欄位位的第2、5、7個欄位能夠在正常網頁中顯示了。這時候你也許可以直接插入user()、database()、version()等Mysql的常量。但是我們這章要說如何獲取數據。首先我們可以通過database()獲取當前資料庫
獲取了資料庫之後,我們就需要查詢表了。
還記得上節課說的如何從information_schema.TABLES。沒錯,如何構造呢?現在知道2、5、7可以顯示數據,那就將我們要顯示的數據放在這三個任意一個位置,我們現在要顯示TABLES表中的TABLE_NAME欄位,所以把它放在5上面去,那麼後面還要規定從哪個數據表裡面查的字句則構造整個SQL語句為:
http://www.xxx.com/huangou.php?id=5 union select 1,2,3,4,TABLE_NAME,6,7,8 from information_schema.TABLES where TABLE_SCHEMA=taogou123 limit 1,1t
整個SQL語句的含義是從information_schema庫中的TABLES表查詢TABLE_NAME,條件是TABLE_SHCEMA=『taogou123』,後面的limit 1,1是限制查詢結果,比如查詢出結果有100條,如果使用了limit 1,1則代表從第一條起,只顯示一條。
那是否如果要查詢第二條則為:limit 2,1(從第二條開始只顯示一條結果),疑問來了?為什麼我們只顯示一條,而不是全部查詢出來呢?很簡單,是因為我們每個欄位上面只能放一個數據,不能同時放多個數據,那麼如何同時放多個數據呢?可以使用concat()、group_concat函數來,這兩個函數我們可以簡單認為是連接字元串,比如group_concat(user(),database(),version())就是把這三個常量的注入結果連接在一起,當做一個整體字元串顯示在注入結果中。這裡則將group_concat放在要查詢的TABLE_NAME上。語句如下:
http://www.xxx.com/huangou.php?id=5 union select 1,2,3,4,group_concat(TABLE_NAME,0x3c2f62723e),6,7,8 from information_schema.TABLES where TABLE_SCHEMA=taogou123
上語句可以發現我們已經將limit去除了,但是問題是0x3c2f62723e是什麼玩意?很簡單,這是一個十六進位,轉換為字元串則是:「</br>」,學過HTML的都知道吧,這是換行的意思。如果我們不加上這個十六進位,列印的結果則是每個表連接在一起,可以從下圖看效果,圖1則是沒用使用換行符的,圖2是使用換行符的,那麼更為直觀好看的就是使用了換行符的。
圖1
圖2
這時候我們就要查詢關鍵表了,可以從結果看出(當然這裡被遮擋了)關鍵表是duoduo_user,接下來就是獲取這個表的欄位了,如果你不知道如何構造獲取欄位的SQL語句,那麻煩你看看上節提到的如何獲取某個表中的欄位。
http://www.xxx.com/huangou.php?id=5 union select 1,2,3,4,group_concat(COLUMN_NAME,0x3c2f62723e),6,7,8 from information_schema.COLUMNS where TABLE_NAME=duoduo_user
恩,語句一目了然,就是查詢從information_schema.COLUMNS中查詢COLUMN_NAME欄位,條件是TABLE_NAME要為duoduo_user。
那麼很簡單了,我們知道如要要獲取「ddusername」、「ddpassword」核心的用戶密碼的正常SQL語句是:select ddusername,ddpassword from duoduo_user; 當然這是在Mysql查詢的時候這樣寫,如果代入我們的SQL語句中則必須用group_concat(ddusername, 0x3c2f62723e, ddpassword)包含起來。最後的SQL語句則為:
http://www.xxxx.com/huangou.php?id=5 union select 1,2,3,4,group_concat(ddusername, 0x3c2f62723e,ddpassword),6,7,8 from duoduo_user
點到為止,到這來實際上我們已經完成了一次注入測試,不必要再做任何性的東西了,最後筆者居然發現這個網站早就被小黑滲透了,作者只能說這名小黑太小孩子了。總結下來,我們可以發現其實我們只要掌握了基本的Mysql語句、了解SQL注入常用的函數、了解information_schema資料庫的查庫、查表、查欄位操作,基本可以完全進行Mysql注入,無論是現在說的Union select注入還是報錯注入、基於布爾值、時間的盲注等等,甚至還可以看懂別人構造的SQL語句,學習SQL注入不再是夢!
難得正經一次,就說到這裡吧。
相關鏈接:你真的會SQL注入攻擊嗎?(上) - 黑客生活 - 知乎專欄
推薦閱讀:
※如何通過郵件進行 XSS?
※如何評價知乎的登錄驗證方式「請點擊圖中倒立的文字」?
※最頂尖的黑客用什麼方法管理自己的重要密碼?
※參加黑客馬拉松需要有哪些技能儲備及注意事項?
※信息安全工程師有全棧一說嗎?