2011年7月24日 星期日

台灣駭客年會 HITCON2011,Wargame Web 4出題心得 & 解法



心得是現在大多數的人對於SQL injection (Mysql)都是union加上information_schema取得資料
但是並不是那麼的簡單,SQL injection其實是一門非常深的學問,就出了這題XD
這個方法最早是在大陸的文章看到,後來有分析到國外的一套SQL自動化攻擊工具havij,裡面也有用到類似的方式。


一個登入介面,題目是
If you can login, You can get the key.

登入畫面

















可以明顯發現確認使用者的頁面存在SQL injection











也可以發現
不能使用union  --> 因為只會顯示True or False,不可能列出任何資訊
不能使用Information_schema --> 假想環境是在mysql4上面運行,在Mysql4以前沒有這個資料庫,這題是我自己patch mysql主程式所以使用不了information_schema查table name以及column name
不能使用blind injection or time base injection  --> 因為無法取得column name不能取得資料

但是,發現他是Error base的Injection。
可以利用Duplicate column name的方式來注入

Example:
在Mysql Commandline下輸入:
    Select * from (Select 1,1) as a
會顯示
    ERROR 1060 (42S21): Duplicate column name '1'

利用Error base的方式像SQL server一樣可以把想要的資料出現在錯誤訊息中。
但是要利用這個爆出非CONST以外的還需要配合NAME_CONST這個函數來達成

For Example:













但是NAME_CONST在Mysql 5.1後被Update了不能使用非常量CONST以外的參數,但是還是有其他的方法的,有興趣可以自己去Google這裡就不詳談了 :P

所以可以利用以下的方式爆出 Column name
id=test' and (Select * from (Select * from users as a join users as b) as c) and ''='
id=test' and (Select * from (Select * from users as a join users as b using(column name)) as c) and ''='












可以得到Column name
wpw_d7862549d4ed8f82
wpw_d7862549d4ed8f82

繼續利用NAME_CONST爆出其中的資料
Example:








可以取得
admin / 0b79f46808458afb

在登入頁面的地方也可以發現輸入單引號也會顯示SQL error,仔細觀察會發現是使用Mysql的old_password來對密碼進行加密。






在Mysql4以前password儲存的方式是透過old_password這個函數進行加密的,實際上這個加密方式存在弱點能被很快速的碰撞(Collision)出來
網路上可以找到現成的工具,約20~30分鐘可以撞出一組hash值與上面一樣的密碼

我自己碰撞的結果是這組
Select old_password('!H6~a`"~H\\DN>');
出來的結果與上面的hash值是一樣的,所以使用admin / !H6~a`"~H\DN> 即可登入取得Key。



:P 解題愉快XD
沒解出來至少有學到新東西吧 :P
有機會再把出的另外一題Web以及Windows Binary解題過程寫出XD


2 則留言: