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

DEBUG

心得是現在大多數的人對於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這個函數來達成

但是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

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

可以取得

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