SQL Injection Get Username
在『SQL Injection attack and defense 』 by Justin Clarke,這本書上看到的蠻有意思的攻擊手法。目的:
在無法直接顯示攻擊資料的狀況下,得到Username。概要流程:
- 確認Username長度
- 找出完整Username名稱
攻擊說明:
步驟1、
現在假設我們有一個確認有SQLi漏洞的URL:http://www.test.com?id=12
這邊以MSSQL為例,步驟1的攻擊如下:
這邊簡單來說就是要做除法運算:
而SQL語法的部份,主要是用CASE語句:
另一個部份:
(註:在MySQL中,是使用length()做查詢。)
(註:MySQL需要將system_user改成user()。)
所以透過上面的語法,我們可以做以下的解釋:
當username長度大於8時,回傳1,否則回傳0
所以最後的結果,會有兩種狀況:
狀況1. 12 ÷ 1=12
狀況2. 12 ÷ 0= ERROR
狀況1,我們可以原來的頁面,因為id是相同的12,但是狀況2的話,則會出現錯誤,很可能就會顯示『500 Internal Server Error』。 透過這個方式,我們可以調整長度,找出確切的長度,可以用類似二分法的減少攻擊次數。
完整的解釋,會是這樣:
system_user的第一個字母,轉成ascii後,若是大於64,回傳1,否則回傳0
透過這個方式,假設username長度為5,我們可以這樣一個一個去檢測:
這攻擊手法,可以稍微做一些調整,將除法改成加法,這樣可以避免產生錯誤訊息,如下:
調整後,我們會得到新的結果:
http://www.test.com?id=12/(case+when+(len(system_user)+>+8)+then+1+else+0+end)(註:在URL中,「+」會被解析成空白。)
這邊簡單來說就是要做除法運算:
12÷ (後面的結果)
而SQL語法的部份,主要是用CASE語句:
CASE WHEN condition THEN result1 ELSE result2 END
另一個部份:
len(system_user) > 8檢視username長度是否大於8
(註:在MySQL中,是使用length()做查詢。)
(註:MySQL需要將system_user改成user()。)
所以透過上面的語法,我們可以做以下的解釋:
當username長度大於8時,回傳1,否則回傳0
所以最後的結果,會有兩種狀況:
狀況1. 12 ÷ 1=12
狀況2. 12 ÷ 0= ERROR
狀況1,我們可以原來的頁面,因為id是相同的12,但是狀況2的話,則會出現錯誤,很可能就會顯示『500 Internal Server Error』。 透過這個方式,我們可以調整長度,找出確切的長度,可以用類似二分法的減少攻擊次數。
步驟2、
確認長度以後,接下來我們要開始找完整username了!
攻擊指令:
http://www.test.com?id=12/(case+when+(ascii(substring((select+system_user),1,1))+>+64)+then+1+else+0+end)
這邊跟步驟1比較不一樣的地方是ascii()以及substring()
- substring(原字串, 起始取值位置, 欲取得的字數)
- EX: substring("test",2,1) => e
- ascii():轉成ascii編碼(ASCII Table http://www.asciitable.com/ )
串接起來以後:
ascii(substring((select system_user), 1, 1) > 64
我們可以這樣解釋:
system_user的第一個字母,轉成ascii後大於64完整的解釋,會是這樣:
system_user的第一個字母,轉成ascii後,若是大於64,回傳1,否則回傳0
透過這個方式,假設username長度為5,我們可以這樣一個一個去檢測:
substring((select system_user),1 ,1) substring((select system_user),2 ,1) substring((select system_user),3 ,1) substring((select system_user),4 ,1) substring((select system_user),5 ,1)然後透過步驟1有說過的方式慢慢找出每一個位置的字母
這攻擊手法,可以稍微做一些調整,將除法改成加法,這樣可以避免產生錯誤訊息,如下:
http://www.test.com?id=12%2B(case+when+(len(system_user)+>+8)+then+1+else+0+end)需要特別注意的是,這邊我們將「+」改成「%2B」,原因是在於「+」在URL裡面是保留字元,會被解析成空白,這也是為什麼會用到這麼多「+」的原因。
調整後,我們會得到新的結果:
- 12+1=13
- 12+0=12
因此,我們可以根據頁面是屬於id=13或是id=12,來判斷攻擊的結果。
資料參考:
- SQL Injection attack and defense, by Justin Clarke
備註:
- URL保留字元:「:」、「/」、「?」、「#」、「[」、「]」、「@」、「!」、「$」、「&」、「'」、「(」、「)」、「*」、「+」、「,」、「;」、「=」、「;」
- URL編碼表:http://www.w3school.com.cn/tags/html_ref_urlencode.html
留言
張貼留言