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验证码类代码( 最新修改,完全定制化! )
Dec 02 PHP
ThinkPHP验证码和分页实例教程
Aug 22 PHP
php开启与关闭错误提示适用于没有修改php.ini的权限
Oct 16 PHP
PHP+jquery+ajax实现即时聊天功能实例
Dec 23 PHP
ThinkPHP自定义函数解决模板标签加减运算的方法
Jul 03 PHP
php禁用cookie后session设置方法分析
Oct 19 PHP
常用PHP封装分页工具类
Jan 14 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
Sep 04 PHP
PHP中创建和编辑Excel表格的方法
Sep 13 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
Jul 08 PHP
php中的钩子理解及应用实例分析
Aug 30 PHP
PHP简单实现图片格式转换(jpg转png,gif转png等)
Oct 30 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
Windows下Apache + PHP SESSION丢失的解决过程全纪录
2015/04/07 PHP
PHP 反射(Reflection)使用实例
2015/05/12 PHP
YII Framework教程之异常处理详解
2016/03/14 PHP
PHP使用函数用法详解
2018/09/30 PHP
laravel框架与其他框架的详细对比
2019/10/23 PHP
php7 list()、session及其他模块的修改实例分析
2020/05/25 PHP
TNC vs BOOM BO3 第二场2.13
2021/03/10 DOTA
取得一定长度的内容,处理中文
2006/12/20 Javascript
js中字符替换函数String.replace()使用技巧
2011/08/14 Javascript
JS读取XML文件示例代码
2013/11/15 Javascript
jquery中html、val与text三者属性取值的联系与区别介绍
2013/12/29 Javascript
Jquery.Form 异步提交表单的简单实例
2014/03/03 Javascript
JQuery导航菜单选择特效
2016/04/11 Javascript
Bootstrap所支持的表单控件实例详解
2016/05/16 Javascript
jQuery soColorPacker 网页拾色器
2016/06/22 Javascript
关于jQuery中fade(),show()起始位置的一点小发现
2017/04/25 jQuery
Angular实现的简单查询天气预报功能示例
2017/12/27 Javascript
浅谈webpack 构建性能优化策略小结
2018/06/13 Javascript
微信小程序配置服务器提示验证token失败的解决方法
2019/04/03 Javascript
在vue中使用回调函数,this调用无效的解决
2020/08/11 Javascript
python实现多线程采集的2个代码例子
2014/07/07 Python
简单介绍利用TK在Python下进行GUI编程的教程
2015/04/13 Python
Python字符串匹配算法KMP实例
2015/07/18 Python
python 截取 取出一部分的字符串方法
2017/03/01 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
Python字节单位转换实例
2019/12/05 Python
Python selenium实现断言3种方法解析
2020/09/08 Python
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
2020/08/24 HTML / CSS
荷兰音乐会和音乐剧门票订购网站:Topticketshop
2019/08/27 全球购物
面向对象编程OOP的优点
2013/01/22 面试题
中医专业应届生求职信
2013/11/17 职场文书
歌唱比赛获奖感言
2014/01/21 职场文书
求职简历的自我评价
2014/01/31 职场文书
2014年度党员自我评议
2014/09/13 职场文书
主持稿开场白
2015/06/01 职场文书
Python实现科学占卜 让视频自动打码
2022/04/09 Python