環境:dvwa 1.7數據庫:mysqlphp
dvwa的安全等級:mediummysql
1、分析和查找注入點
(1)知識點回顧
若是上一篇有好好讀過的同窗應該知道,咱們上一篇遇到的字符型注入。也便是經過Get或者Post方式傳進去的數據被單引號或者雙引號包裹住。若是咱們想要注入本身的payload(有效載荷)的話,則咱們必須先閉合前面的單引號或者雙引號,不然咱們的數據始終會被當作成字符串來處理。
這種類型的注入點稱爲字符型注入點。
(2)此次咱們的把防護等級提高了一個層次,來逐步增強咱們手工注入的能力以及開更多關於sql注入的腦洞!此次咱們依舊先分析web應用的功能,而後測試咱們輸入的參數是否被正確的處理。
一、仍是來到咱們SQL injection這裏,能夠看到這裏仍是和上次同樣,給出一個輸入框,讓咱們輸入ID的數值,而後返回對應ID的firstname,surname這兩個信息。
[1]當咱們輸入正常的數字1的時候,能夠看到返回對應數據
[2]當咱們輸入「1'」的時候,能夠看到有報錯信息。也就是說用戶的輸入沒有被正當的處理,從而引發數據庫的語法錯誤,看起來有戲!
同時咱們仔細觀察一下,咱們輸入的「'」被「\」轉義了,變成了這樣子「\'」。也就說這裏,應用程序進行的過濾應該是利用php裏面addslashes相似的函數,這個函數會處理四個數據。分別是單引號【'】、雙引號【"】、反斜槓【\】、空字符【null】。
[3]這裏咱們繼續測試,看一看是否是用了相似的函數
測試數據:
(1) 「1"」
(2)「1\」
(3)「%00」注意由於咱們沒辦法用鍵盤輸入空字符,可是能夠在url上使用%00來表示,因此纔會有地址欄上的%00
(4)測試一下其餘的字符,「-」、「&」。能夠發現雖然也是報錯了,但是並無出現轉義字符
二、這個時候咱們思考一下,要是字符型的注入點,咱們的輸入單引號已經被轉義,按道理來講不該該出現報錯的信息。
首先仍是選擇數據庫爲dvwa
use dvwa;
這裏咱們在本地數據庫測試一下。
select * from users where user_id = '1\'';
能夠看到當咱們的輸入語句帶上轉義的單引號時,不但沒有報錯還能查詢成功。
(1)不報錯的緣由是,這裏的單引號已經被轉義,從而整個字符串的值爲 1\'
(2)那爲何會查詢成功呢?
這裏涉及的知識是強制類型轉換,咱們先來看一下表的定義
describe users;
能夠看到user_id這個類型是int整型,當咱們的查詢像上面的同樣的時候,mysql會將字符串強制類型轉換成int類型,可是這種轉換是有缺陷的!
下面給出三個例子,你們感覺一下!
select * from users where user_id = '1abdc';
select * from users where user_id = 'abdc';
select * from users where user_id = '2abdc';
上面的例子中,第二個由於一開始沒有數字,因此在轉換類型的時候,會轉換成0。
具體能夠看一下這個例子。
三、根據上面兩部分的分析,咱們能夠知道此次咱們傳進去的數據並非被包裹在單引號或者雙引號裏面的,這時候咱們得介紹第二種類型的注入點了,數字型注入。
(1)測試,說明是數字型,那咱們來進行簡單的加減運算就能夠知道它是否存在注入點了。
測試:在輸入框裏面
[1]輸入2的時候,反饋的是ID爲2的用戶信息
[2]輸入1+1的時候,反饋和2的結果同樣。也就是說明這裏存在注入點。相似的也可使用減號「-」、「*」、「/」這些運算符號。
PS:可是這裏須要注意的是,在URL中「+」是有特別含義,它表示的是空格。因此在URL中咱們須要使用「%2B」來代替「+」。
2、構造payload
簡單說明:其實數字型注入就是咱們的數據不須要再閉合單引號能夠直接注入到查詢中。因此以後構造payload部分很大程度和字符型同樣。
一、猜想字段數
這裏使用order by 來猜想
Payload:
1 order by 1
1 order by 2
1 order by 3
能夠發如今3的時候,出現錯誤。於是能夠得出字段數爲2
二、以後的過程和字符型注入同樣,只不過是去掉了Payload前面的單引號以及最後面的註釋符號。要是有疑惑的能夠看上一篇文章。不過這裏要重點的提一下,要是咱們想要使用字符串的話,能夠有兩種方法。
[1]使用字符串的十六進制來表示,例如admin轉化爲十六進制,爲「61646D696E」
而後咱們以後在十六進制前加上0x61646D696E
咱們構造的payload像這樣便可
select * from users where user = 0x61646D696E;
[2]使用char函數,但這裏char函數使用的參數是十進制的ascii數值。好比admin
CHAR(97, 100, 109, 105, 110)
構造的payload像這樣便可
select * from users where user = CHAR(97, 100, 109, 105, 110);
三、這裏構造最終的payload
獲取數據庫名:
-1 union select 1,database()
獲取表名:
-1 union select table_name,2 from information_schema.tables where table_schema = database()
獲取users表的列名
-1 union select column_name,2 from information_schema.columns where table_schema = database() and table_name = 0x7573657273
獲取數據表內容
-1 union select user,password from users;
四、好了又到去MD5網站破解密碼的時候,小夥伴興奮否,又是一次驗證本身成果的時候。
這裏咱們選擇用戶名爲1337的用戶,好!
Duang ,密碼出來了!開心死了
3、好了,到開腦洞時刻
這個時候咱們來了解一下什麼是黑盒測試以及白盒測試?
一、黑盒測試
黑盒:言下之意就是咱們對web應用所知甚少,就像咱們對一個封閉的箱子的瞭解同樣,咱們可以獲取的信息不多。咱們所擁有的是數據的輸入口,以及數據的輸出口!
(1)經過構造特定的輸入來觀察輸出,從而去分析web應用是如何去處理咱們的數據。好比上面,咱們輸入的id值被轉義了,可是咱們不清楚是否是隻對某一部分的內容就行轉義,因而咱們利用"&"、"-"、"+"這些特殊字符去測試。
(2)通常來講,要是咱們在前期測試獲取了足夠多的信息,能夠搭建本地環境,而後對本地環境進行模糊測試(也就是輸入大量無序特別的的數據,去觀察應用程序的反應),同時也能夠避免大量測試引發管理員的注意
(3)對於黑盒測試來講,更像咱們正常的***。咱們經過搜索引擎,各類信息泄露的查詢方法來獲取關於web應用方面的信息!
而咱們這兩次的學習都是黑盒測試,由於咱們只擁有數據的輸入以及能夠獲取數據的輸出。
二、白盒測試
白盒:與黑盒測試相反,咱們知道的信息不少。
(1)能夠知道web應用的邏輯,它會怎樣處理輸入數據,好比咱們被告知輸入部分被"\"轉義,這個時候,咱們就會去思考,怎麼構造payload吃掉"\"。
(2)能夠知道web應用所具備的功能,好比被告知有文件上傳功能,這個時候咱們去思考是否存在文件上傳漏洞,或者服務器的解析漏洞
(3)能夠知道網絡拓撲結構,咱們則能夠經過指定***流程,好比先拿下web服務器,而後利用web服務器來打開內網的大門。
(4)有時還能夠知道源碼,要是能夠知道源碼的話,能夠經過分析應用程序如何過濾輸入,而後找到其不嚴謹的地反,既能夠繞過!
web