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

metinfo 6.2.0正則匹配不嚴謹導致注入+getshell組合拳

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


 
今天公司做技術分享,分享了項目中的一個攻擊metinfo的案例,很有意思的攻擊鏈,記錄下。
 
svn泄露
svn是一個開放源代碼的版本控制系統,如果在網站中存在.svn目錄,那么我們可以拿到網站的源代碼,方便審計。關于svn泄露需要注意的是SVN 版本 >1.7 時,Seay的工具不能dump源碼了。可以用@admintony師傅的腳本來利用 https://github.com/admintony/svnExploit/
在目標站中發現了http://php.local/.svn/目錄泄露源代碼,發現是metinfo cms,拿到了位于config/config_safe.php中的key,這個key起到了很大作用。
什么是key呢?為什么要有這個key呢?
在metinfo安裝完成后,會在config/config_safe.php寫入一個key,這個key是用來加密解密賬戶信息的,你可以在app/system/include/class/auth.class.php看到加解密算法。

可以看到加解密采用了$this->auth_key.$key作為鹽值,$key默認為空,那么這個$this->auth_key在哪定義的呢?
config/config.inc.php:109

有了這個key,我們可以自己針對性去加密解密程序密文。
有什么用呢?大部分的cms都會有全局參數過濾,而metinfo的全局過濾簡直變態,我們很難直接從request中找到可用的sql注入,而加了密之后的參數一半不會再進行過濾了,我們可以找下可控的加密參數。
 
正則匹配導致的注入
全局搜索$auth->decode尋找可控的參數,并且不走過濾的。

app/system/user/web/getpassword.class.php:93
public function dovalid() {
    global $_M;
    $auth = load::sys_class('auth', 'new');
    $email = $auth->decode($_M['form']['p']);
    if(!is_email($email))$email = '';
    if($email){
        if($_M['form']['password']){
            $user = $this->userclass->get_user_by_email($email);
            if($user){
                if($this->userclass->editor_uesr_password($user['id'],$_M['form']['password'])){
                    okinfo($_M['url']['login'], $_M['word']['modifypasswordsuc']);
                }else{
                    okinfo($_M['url']['login'], $_M['word']['opfail']);
                }
            }else{
                okinfo($_M['url']['login'], $_M['word']['NoidJS']);
            }
        }
        require_once $this->view('app/getpassword_mailset',$this->input);
    }else{
        okinfo($_M['url']['register'], $_M['word']['emailvildtips2']);
    }
}
可以看到$email直接從$_M['form']['p']中經過$auth->decode 解密獲取,并沒有進行過濾,然后在get_user_by_email($email)中代入數據庫查詢。但是經過了is_email($email)判斷是否為正確的郵箱地址。
跟進app/system/include/function/str.func.php:26
function is_email($email){
    $flag = true;
    $patten = '/[w-][email protected][w-]+.[a-zA-Z.]*[a-zA-Z]$/';
    if(preg_match($patten, $email) == 0){
        $flag = false;
    }
    return $flag;
}
很正常的正則表達式,但是唯一缺少的是^起始符!那么我們構造如' and 1=1-- [email protected]也會返回true!
email要經過$auth->decode解密,這個時候我們的key就派上用場了,我們可以使用$auth->encode()來加密我們的payload傳進去,構成注入。
將auth類自己搞一份出來。
function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0){
    $ckey_length = 4;
    $key = md5($key ? $key : UC_KEY);

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

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