繁体中文
设为首页
加入收藏
当前位置:PHP技术首页 >> PHP基础 >> phpBB BBcode处理的漏洞

phpBB BBcode处理的漏洞

2005-02-15 08:00:00  作者:  来源:互联网  浏览次数:0  文字大小:【】【】【
简介:bugtraq ID 4432、4434 存在问题的版本: PHPBB 1.44,更低的版本及 PHPBB 2.0 未测试。 描述: PHPBB是一个被广泛应用的基于PHP的论坛。发现其BBcode中对于“源代码”类的引用处 理存在漏洞,通过发送特殊格式的...
关键字:漏洞 处理 BBcode phpBB

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!

但实际上贴子的标题和提交者这两个数据已存到数据库中,但内容和其他一些数据没有,所

以打开的时候会出现错误页面。而且这样的帖子无法用正常的方法删掉,只能用直接连接到

数据库来删除。以下是提交不同数据量的结果:

''* ==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", "

Code:

\\1

", $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的,希望大家自己对自己的论坛进行测试,如有问题,参考本文酌情解决。

责任编辑:admin
相关文章