我的天吶!你曾用過 LIKE 嗎?

來源:SpiderLab
標題:LIKE, omg!
作者:Dan Crowley
內文:
假如你有時常閱讀作者的部落格,你應該看過他的 SQL injection測試平台─ SQLol 。作者聽到有人對他的題目有 疑問 ,因此最新版本中,新增了一個跟 "LIKE" 有關的挑戰。作者熱切期待的要分享這個攻擊手法。

LIKE 關鍵字的作用跟等於運算子 "=" 類似。然而他也支援萬用字元,"%" 可以允許零個以上字元, "_" 只能對應到一個字元。LIKE常出現在以下場景:
select * from used_cars where make LIKE '%Toyota%'

這段查詢句會返回 used_cars 資料表中欄位 make 包含 Toyota字串的所有資料列。 假設我們能控制 LIKE 子句的輸入值,就能以暴力破解方式得到 "make" 欄位所有的內容。假設以下的(不合適的)查詢句是用來執行登入的動作:
select * from users where username LIKE 'input_username' and password LIKE 'input_password'


使用者若很善良,不知道萬用字元的好處,登入之後都很正常。但如果有人加入了"%"到使用者帳號或密碼的欄位之中,還無疑問的會回傳所有使用者資料,以至於任何人都能合法登入。還有,即使工程師已經過濾單引號的威脅,我們也可以得知資料庫中所有的帳號和密碼。

第一步,我們想要知道所有使用者帳號。我們輸入帳號 "%A%",密碼 "%" ,查詢句會返回所有包含大寫A的帳號資訊。然後我們重複查詢其他可能性,下一步,我們輸入的格式為 "A%"。

假設我們有一組字串為"abfor"。我們可以嘗試:

a%  b%  f%  o%  r%

假設使用帳號"f%" 和 "b%" 可以成功登入。這表示存在著包含 f 和 b 開頭的帳號。我們可以繼續嘗試帳號中第二個字元的可能性。

fa% fb% ff% ... br%

最終,我們可以查出所有的帳號名稱。下一步我們再去列舉出所有密碼,然後以這些密碼去嘗試登入看看每個帳號。這個動作會產生大量的登入失敗,程式設計師可能會設計以下查詢句來阻止你使用 "%" 登入。

update users set locked_out=1 where username LIKE '%'

然後,你的分機響起。

作者認為最有趣的是,無論你使用參數化查詢句預儲程序、白名單機制或應用程式防火牆可以解決這個問題。這樣的使用情境處在灰色地帶,就算你禁止使用 % ,也可以利用底線"_",或者多個底線來達成一樣的效果。這表示你必須時時刻刻注意自己的程式,必須多加測試安全性。

留言

這個網誌中的熱門文章

資安JAVA(十一):X-XSS-Protection

資安JAVA(十):X-Content-Type-Options

以 SharpPcap 實作可收聽封包的 C# 程式