phpBB BBcode處理的漏洞

來源:互聯網
上載者:User
bugtraq ID 4432、4434

存在問題的版本:

phpBB 1.44,更低的版本及 phpBB 2.0 未測試。


描述:

phpBB是一個被廣泛應用的基於PHP的論壇。發現其BBcode中對於“原始碼”類的引用處
理存在漏洞,通過發送特殊格式的逸出字元串可導致資料庫的損壞以及伺服器的 CPU、記憶體
資源大量消耗。


詳細:

phpBB在對“原始碼”類的引用處理不當,主要是為了要支援鑲套的標記
而造成的。有問題的代碼是functions.php中的bbencode_code函數。

當我們提交一個這樣的貼子:





實際向資料庫中儲存的資料是這樣:

[1code]
\0\0\0\0\0\0\0
[/code1][1code]
\0\0\0\0\0\0\0
[/code1][1code]
\0\0\0\0\0\0\0
[/code1][1code]
\0\0\0\0\0\0\0
[/code1][1code]
\0\0\0\0\0\0\0
[/code1][1code]
\0\0\0\0\0\0\0
[/code1][1code]
\0\0\0\0\0\0\0
[/code1]

即實際系統要負擔的資料量是輸入的“\0”的數量的平方,如果發送 1 MByte的資料,系統
實際處理的資料將接近 1 TByte。

這是我們在實驗機器上發送一個包含''*800的文章時的資源佔用情況:

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND
8643 nobody 13 0 212M 81M 13604 D 8.0 65.7 0:07 httpd

提交貼子後會提示出錯:

Could not enter post text!

但實際上貼子的標題和提交者這兩個資料已存到資料庫中,但內容和其他一些資料沒有,所
以開啟的時候會出現錯誤頁面。而且這樣的文章無法用正常的方法刪掉,只能用直接連接到
資料庫來刪除。以下是提交不同資料量的結果:

''* =<583 正常貼上,可以刪除
''* 584 正常貼上,可以編輯,但不能刪除
''* 585 提示 Could not enter post text! 但貼子也沒有
''* 586 正常貼上,可以刪除
''* 587 提示 Could not enter post text! 但貼子也沒有
''* 588 正常貼上,可以刪除
''* 589 提示 Could not enter post text! 但貼子也沒有
''* >=590 提示 Could not enter post text! 出現刪不掉的文章

如果發送鑲套的標記則佔用資源更多,我們在實驗機器上發送這樣的文章:

以下內容為程式碼[code]\0\0[/code]

雖然只有49Byte的資料,但資源佔用非常可觀:
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND
25741 nobody 14 0 11828 9996 416 R 99.9 7.8 2:38 httpd

幾秒鐘後產生了大量的資料,記憶體大量消耗:
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND
3 root 10 0 0 0 0 SW 2.5 0.0 4:13 kswapd
25742 nobody 17 0 265M 90M 52104 R 25.1 73.0 1:45 httpd

這樣的鑲套文章是不會儲存到資料庫中的,但隨著鑲套的增加資源的佔用會按照幾何級數遞
增。如果一次發送更多資料,或者不斷的發送,可以導致系統資源大量佔用,最終拒絕服務。

實驗環境:linux 2.4.10 Apache/1.3.23 PHP 4.12


解決方案:

1、暫時禁用BBcode。
2、alert7給出了functions.php的如下修改方法,暫時停用對鑲套標記的支援:

把773行開始的bbencode_code函數改為:

function bbencode_code($message, $is_html_disabled)
{
$message = preg_replace("/\[code\](.*?)\[\/code\]/si", "<!-- BBCode Start --><TABLE BORDER=0 ALIGN=CENTER WIDTH=85%><TR><TD><font size=-1>Code:</font><HR></TD></TR><TR><TD><FONT SIZE=-1><PRE>\\1</PRE></FONT></TD></TR><TR><TD><HR></TD></TR></TABLE><!-- BBCode End -->", $message);
return $message;

} // bbencode_code()

對於無法正常刪除的文章,需要手工串連資料庫刪除。假設有這樣一個文章:
http://host/forums/viewtopic.php?topic=1162&forum=1&0
可以這樣:
$ mysql -uuser -ppasswd
mysql> use databasename;
mysql> select * from topics where topic_id = 1162; //得到post_id
mysql> delete from posts where post_id = 6280;
mysql> delete from posts_text where post_id = 6280;
mysql> delete from topics where topic_id = 1162;


關於我們:

WSS (Whitecell Security Systems),一個非營利性民間技術組織,致力於各種系統安
全技術的研究。堅持傳統的hacker精神,追求技術的精純。

WSS 首頁:http://www.whitecell.org/
WSS 論壇:http://www.whitecell.org/forum/


補充:後來的測試發現相當多的BBS都有類似問題,包括基於php、cgi、asp的,希望大家自己對自己的論壇進行測試,如有問題,參考本文酌情解決。

相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。