Discuz論壇是由Crossday工作室(涉及版本:
目前(2003/9/21)所有免費(fèi)版本(我沒(méi)有商業(yè)版)
描述:
由于pm.php發(fā)送消息那部分代碼,缺乏對(duì)時(shí)間間隔的限制。導(dǎo)致任何用戶可以對(duì)任何用戶發(fā)送消息炸彈。導(dǎo)致服務(wù)器空間、資源被消耗。嚴(yán)重可導(dǎo)致拒絕服務(wù)。
具體:
大家可以看到pm.php文件的86行的代碼:
86 } elseif($action == ’send’) {
87
88 if(!$pmsubmit) {
……
179 showmessage(’pm_send_succeed’, ’pm.php’);
180 }
這部分代碼沒(méi)有檢測(cè)用戶發(fā)送短信的時(shí)間間隔限制代碼。我們只要注冊(cè)任意一個(gè)用戶登陸后,提交:
http://127.0.0.1/discuz/pm.php?action=send...st&message=test
就可以轟炸angel這個(gè)用戶了。提高效率的攻擊方法:
#incluse
main()
{
int i;
for(i=0;i<55933;i++)
{
printf("\nwww.xxx.com/discuz/pm.php?action=send&pmsubmit=submit&msgto=angel&subject=test&message=test",i);
}
}
編譯運(yùn)行file.exe >discuzpm.txt,然后把discuzpm.txt導(dǎo)入任何一款CGI掃描器。Run……
防范方法:
一,限制用戶發(fā)信的間隔時(shí)間
可以利用PHP的SESSION或者COOKIE來(lái)限制用戶每次發(fā)信的間隔。處理用戶發(fā)送短信時(shí),可以選擇以下兩種方式區(qū)別用戶是否在規(guī)定的時(shí)間內(nèi)連續(xù)發(fā)送短信,假設(shè)管理員設(shè)置兩次發(fā)帖時(shí)間的間隔為2分鐘,看看下面兩個(gè)例子:
Cookie方式:
if ($beforepmid) die("對(duì)不起,你兩次發(fā)信的時(shí)間間隔還不到2分鐘"); // $beforepmid
前一次發(fā)信的ID
else setcookie("beforepmid",$pmid,time()+60*2,"/","",0); // $pmid
短信ID
Session方式:
session_start();
if (session_is_registered("time") && time()-$_SESSION[’time’]<60*2)
{
die("對(duì)不起,你兩次發(fā)帖的時(shí)間間隔還不到2分鐘"); // $time 前一次發(fā)信的時(shí)間
} else {
$time=time();
session_register("time");
}
看起來(lái)Cookie需要發(fā)送到客戶端,攻擊者可以刪除該Cookie,好象Session比較安全些,在服務(wù)器端。不過(guò)實(shí)際上我認(rèn)為應(yīng)該是差不多的。因?yàn)樗沁B續(xù)發(fā)送,中間的間隔時(shí)間很短,來(lái)不急去刪除該Cookie的。但也不排除自己編段小程序來(lái)刪除Cookie。為了萬(wàn)全,還是使用Session吧。Session方式的文件為"session_pm.php",去掉前面的"session_"然后覆蓋到Discuz目錄下,記得備份原Discuz目錄下的pm.php,以免出錯(cuò)后可以挽回。
如果希望用Cookie的方式來(lái)防止攻擊的哈,就用這個(gè)"cookie_pm.php"吧。把前面的"cookie_"去掉,然后覆蓋到Discuz目錄下,最好先備份Discuz目錄下的pm.php文件。
二,對(duì)于以上提高效率的攻擊的防止辦法
將第86行后加入以下代碼
$pmsubmit=$_POST[’pmsubmit’];
$msgto=$_POST[’msgto’];
$subject=$_POST[’subject’];
$message=$_POST[’message’];
OK,這下上面所說(shuō)的的高效攻擊方法失效了。
最后,付上兩個(gè)修改好的pm.php文件(http://www.4ngel.net/img/pm.rar)。一個(gè)為cookie方式,一個(gè)為session方式。如果你是直接使用上面文件中的一樣,請(qǐng)將文件名改為pm.php然后在覆蓋到discuz目錄下,再進(jìn)入管理遠(yuǎn)后臺(tái)的:界面風(fēng)格->模板套系
下編輯:Discuz! 語(yǔ)言包 下的 templates 選項(xiàng)。搜索"pm_box_isfull",把
’pm_box_isfull’ => ’您的信箱已滿,在閱讀短消息前必須刪除一些不用的信息。’,
改為以下內(nèi)容:
’pm_box_isfull’ => ’您的信箱已滿,在閱讀短消息前必須刪除一些不用的信息。’,
’pm_send_partition’ => ’對(duì)不起,你兩次發(fā)信的時(shí)間間隔還不到2分鐘。’,
’pm_nonexistence’ => ’對(duì)不起,短消息不存在或已被刪除。’
特別感謝金玄網(wǎng)(http://www.gixuan.net)的金玄給予大力的支持和幫助。其實(shí)discuz論壇還是個(gè)未成熟的論壇。還有一些大大小小的漏洞。希望開發(fā)者們能注意。


