phpBB BBcode处理的漏洞


Posted in PHP onOctober 09, 2006

发布日期:2002-04-3
漏洞类别:PHP,远程WEB接口,拒绝服务

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

PHP 相关文章推荐
php一些公用函数的集合
Mar 27 PHP
PHP 的ArrayAccess接口 像数组一样来访问你的PHP对象
Oct 12 PHP
基于python发送邮件的乱码问题的解决办法
Apr 25 PHP
PHP设计模式之命令模式的深入解析
Jun 13 PHP
php中文乱码怎么办如何让浏览器自动识别utf-8
Jan 15 PHP
PHP提示Warning:phpinfo() has been disabled函数禁用的解决方法
Dec 17 PHP
php获得文件大小和文件创建时间的方法
Mar 13 PHP
php实现多城市切换特效
Aug 09 PHP
双冒号 ::在PHP中的使用情况
Nov 05 PHP
thinkPHP+PHPExcel实现读取文件日期的方法(含时分秒)
Jul 07 PHP
PHP 用session与gd库实现简单验证码生成与验证的类方法
Nov 15 PHP
微信公众号模板消息群发php代码示例
Dec 29 PHP
用IE远程创建Mysql数据库的简易程序
Oct 09 #PHP
PHP使用者状态管理功能的应用
Oct 09 #PHP
PHP安全编程之加密功能
Oct 09 #PHP
PHP中的加密功能
Oct 09 #PHP
PHP编程网上资源导航
Oct 09 #PHP
如何使用动态共享对象的模式来安装PHP
Oct 09 #PHP
PHP开发文件系统实例讲解
Oct 09 #PHP
You might like
不用GD库生成当前时间的PNG格式图象的程序
2006/10/09 PHP
PHP高级对象构建 多个构造函数的使用
2012/02/05 PHP
Laravel5中contracts详解
2015/03/02 PHP
PHP生成plist数据的方法
2015/06/16 PHP
使用vs code编辑调试php配置的方法
2019/01/29 PHP
关于PHP求解三数之和问题详析
2020/11/09 PHP
jQuery 页面 Mask实现代码
2010/01/09 Javascript
combox改进版 页面原型参考dojo的,比网上jQuery的那些combox功能强,代码更小
2010/04/15 Javascript
javascript检测浏览器flash版本的实现代码
2011/12/06 Javascript
一个页面元素appendchild追加到另一个页面元素的问题
2013/01/27 Javascript
js实现table添加行tr、删除行tr、清空行tr的简单实例
2016/10/15 Javascript
详解vue-cli + webpack 多页面实例应用
2017/04/25 Javascript
详解如何将angular-ui的图片轮播组件封装成一个指令
2017/05/09 Javascript
Jquery中attr与prop的区别详解
2017/05/27 jQuery
vue 如何添加全局函数或全局变量以及单页面的title设置总结
2017/06/01 Javascript
Angular4 反向代理Details实践
2018/05/30 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
2018/07/23 Javascript
详解vuex中action何时完成以及如何正确调用dispatch的思考
2019/01/21 Javascript
element-ui 本地化使用教程详解
2019/10/28 Javascript
jquery实现烟花效果(面向对象)
2020/03/10 jQuery
基于Vue中的父子传值问题解决
2020/07/27 Javascript
[58:11]守擂赛第二周擂主赛 DeMonsTer vs Leopard
2020/04/28 DOTA
整理Python中的赋值运算符
2015/05/13 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
2019/07/01 Python
使用darknet框架的imagenet数据分类预训练操作
2020/07/07 Python
通过实例简单了解python yield使用方法
2020/08/06 Python
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
Hotels.com拉丁美洲:从豪华酒店到经济型酒店的预定优惠和折扣
2019/12/09 全球购物
日语翻译个人求职的自我评价
2013/10/14 职场文书
运动会稿件200字
2014/02/07 职场文书
社会工作专业求职信
2014/07/15 职场文书
敬老院义诊活动总结
2015/05/07 职场文书
浅析NIO系列之TCP
2021/06/15 Java/Android
php修改word的实例方法
2021/11/17 PHP
PHP RabbitMQ消息列队
2022/05/11 PHP
JS轻量级函数式编程实现XDM二
2022/06/16 Javascript