CTF–Web安全–SQL注入之報錯注入
一、報錯注入的概念
用戶使用數據庫查詢語句,向數據庫發送錯誤指令,數據庫返回報錯信息,報錯信息中參雜著我們想要獲取的隱私數據。通常在我們在頁面顯示中找不到回顯位的時候,使用報錯注入。
二、報錯注入常見的三種形式
1、extractvalue報錯注入
2、updatexml報錯注入
3、floor報錯注入
除以上三種,還有大量的報錯注入形式,以上三種最為常見,其中floor報錯注入較復雜。
三、extractvalue報錯注入
extractvalue:extract(獲取) + value(值,有價值的信息)
打開HackBar,注入語句:
備注:
1、0x7e 為 ‘~’ 的ASCLL碼,直接寫 ‘~’ 也沒有問題,目的就是將 / 換作 ~ 使頁面報錯。
2、concat()函數為連接函數,可以將括號中的參數拼接到一起。
3、函數的第一個參數通常習慣用1表示,可以不用管它。
注入語句后,我們在頁面報錯信息中,可以看到所在數據庫名稱security。
接著我們在security庫中查詢它的表有哪些。
我們查詢到:security庫中有 emails,refers,uagents,users四張表,根據英文釋義,用戶信息應該存儲在users的那張表里,接著我們要查詢user表中的列有哪些。
我們查詢到:users表中有三列:分別是id、username、password,毫無疑問,username和password是我們要獲取的數據。接著使用查詢語句獲取這些信息。
但是查詢到的數據非常有限,只能查詢到部分用戶的用戶名和密碼,故使用substr()函數,通過手動翻頁來實現查詢到全部的用戶信息。
注:substr(待查詢字符串,查詢起始位置,查詢長度)。
extractvalue()報錯注入最多顯示30個字節。
四、updatexml報錯注入(細節與extractvalue幾乎一致)
報錯原理 約等于 extractvalue,利用~寫出錯誤的path,使頁面報錯。
注入語句,查詢當前數據庫庫名。第一個參數和第三個參數不用管,1和3就可以,我們的目的就是讓它報錯。
當前庫名為security,查詢庫中表名。
查詢user庫中的列名。
查詢用戶信息。
經過以上步驟,可以獲得用戶的全部信息。