歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

記一次某 CMS 的后臺 getshell

來源:本站整理 作者:佚名 時間:2019-06-05 TAG: 我要投稿

前言
出于對審計的熱愛,最近審了一下某 cms,審出了個后臺 getshell,雖然危害不算太大,但是過程很有意思,在這里分享一下。
 
漏洞發現
代碼審計
翻翻找找中找到了,這個函數:
function saxue_writefile( $_fileurl, $_data, $_method = "wb" ) {
    $_fileopen = @fopen( $_fileurl, $_method ); // 嘗試打開文件
    if ( !$_fileopen ) {
        return false;
    }
    @flock( $_fileopen, LOCK_EX );
    $_ret = @fwrite( $_fileopen, $_data ); // 寫入內容
    @flock( $_fileopen, LOCK_UN );
    @fclose( $_fileopen );
    @chmod( $_fileurl, 511 );
    return $_ret;
}
這是個純潔的函數,沒有任何的過濾,第一個參數是 文件名,第二個參數是 內容,這和 file_put_contents 函數一樣。
現在我們有個 “高危函數”,我們可以找找哪里調用了他, 又經過了很多次翻翻找找,在 adminpages.php 下有一段引起了我的注意:
case 'html':
        ...   
    $row = `從 pages 數據表中獲取值`;
    saxue_writefile(
        $filepath . '/' . $row['filename'] ,
        $saxueTpl -> fetch( SAXUE_THEME_PATH . '/pages/' . $row['template'] )
    );
        ...
這里省略了大部分代碼,留下了兩行關鍵的。
之所以注意起這行代碼,是因為我看到這個最后的 $row['filename']。我就基本盲猜他是從數據庫中拿出來的,這就說明了,我們有可能可以通過后臺某項設置控制它。
然后我們看看第二個參數也是從 row 取出來的,當然,你會看到第二個參數還經過了一個函數: $saxueTpl -> fetch 。
由于他取出來的是 template 而且是 fetch 函數,我再一次盲猜他是獲取文件內容的,這里暫時先不跟。
現在我們來看看這兩個數值到底能不能控制,在 case html 下面,緊跟著的是 case add,我們來看看這個 case add。
case 'add':
    $row = array();
    if ( isset( $_POST['dosubmit'] ) ) {
            $_POST['item'] = strtolower( trim( $_POST['item'] ) );
            $_POST['title'] = trim( $_POST['title'] );
            $_POST['content'] = trim( $_POST['content'] );
            $_POST['htmldir'] = trim( $_POST['htmldir'] );
            $_POST['htmlurl'] = trim( $_POST['htmlurl'] );
            $_POST['filename'] = trim( $_POST['filename'] );
            if ( isset( $_REQUEST['id'] ) ) {
                $data = $data_handler -> create( false ); // 編輯時調用到此處
            } else {
                $data = $data_handler -> create(); // 根據 $_POST 創建一個數組,方便插入。
            }
            if ( !$data_handler -> insert( $data ) ) { // 插入 $data ,即 $_POST 的數據
                saxue_printfail( LANG_ERROR_DATABASE );
            }
果不其然,我們在這里看到了我們的 filename,在下面 insert 了,其間沒有任何過濾。
當然你還會看這里沒有 template,但是真的沒有嗎?我們可以測試看看。
漏洞測試
實踐是檢驗真理的唯一標準。
訪問后臺的 pages.php:

點擊添加單頁,然后抓包:

當然,能不能任意改值呢?比如 filename 改成 .php 后綴,template 改成別的路徑的文件可以嘛?
我們試試:

數據庫:

最后我們要驗證 fetch 函數到底是不是獲取文件內容的,我們也不需要跟進函數內部,直接測試就好。

[1] [2] [3]  下一頁

【聲明】:黑吧安全網(http://www.zjtpzs.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        神秘东方电子游艺