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 相关文章推荐
phpMyAdmin 链接表的附加功能尚未激活的问题
Aug 01 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
Nov 12 PHP
2个Codeigniter文件批量上传控制器写法例子
Jul 25 PHP
PHP针对JSON操作实例分析
Jan 12 PHP
9个比较实用的php代码片段
Mar 15 PHP
Symfony2中被遗弃的getRequest()方法分析
Mar 17 PHP
laravel实现批量更新多条记录的方法示例
Oct 22 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
Dec 21 PHP
PHP常见的几种攻击方式实例小结
Apr 29 PHP
Yii框架中使用PHPExcel的方法分析
Jul 25 PHP
laravel框架与其他框架的详细对比
Oct 23 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
Feb 06 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
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
2016/09/11 PHP
php 修改上传文件大小限制实例详解
2016/10/23 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
innerhtml用法 innertext用法 以及innerHTML与innertext的区别
2009/10/26 Javascript
jQueryUI的Dialog的简单封装
2010/06/07 Javascript
使用Jquery来实现可以输入值的下拉选单 雏型
2011/12/06 Javascript
JS读取cookies信息(记录用户名)
2012/01/10 Javascript
基于Jquery实现的一个图片滚动切换
2012/06/21 Javascript
跨浏览器的事件对象介绍
2012/06/27 Javascript
js 动态修改css文件的方法
2014/08/05 Javascript
jQuery控制网页打印指定区域的方法
2015/04/07 Javascript
javascript实现checkbox全选的代码
2015/04/30 Javascript
理解 JavaScript Scoping &amp; Hoisting(二)
2015/11/18 Javascript
谈谈AngularJs中的隐藏和显示
2015/12/09 Javascript
使用angularjs创建简单表格
2016/01/21 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
2016/06/13 Javascript
深入理解JavaScript定时机制
2016/10/27 Javascript
JS针对Array的各种操作汇总
2016/11/29 Javascript
vue项目搭建以及全家桶的使用详细教程(小结)
2018/12/19 Javascript
原生javascript实现连连看游戏
2019/01/03 Javascript
JS简单判断是否在微信浏览器打开的方法示例
2019/01/08 Javascript
jQuery 选择方法及$(this)用法实例分析
2020/05/19 jQuery
Python Web框架Pylons中使用MongoDB的例子
2013/12/03 Python
100行python代码实现跳一跳辅助程序
2018/01/15 Python
python pandas dataframe 按列或者按行合并的方法
2018/04/12 Python
python实现简易内存监控
2018/06/21 Python
Python数据持久化shelve模块用法分析
2018/06/29 Python
pandas如何处理缺失值
2019/07/31 Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
2020/04/27 Python
Python基于Socket实现简易多人聊天室的示例代码
2020/11/29 Python
有关HTML5页面在iPhoneX适配问题
2017/11/13 HTML / CSS
介绍一下JMS编程步骤
2015/09/22 面试题
宣传工作经验材料
2014/06/02 职场文书
小学秋季运动会加油口号及加油稿
2019/08/19 职场文书
Java 超详细讲解IO操作字节流与字符流
2022/03/25 Java/Android
python数字图像处理之对比度与亮度调整示例
2022/06/28 Python