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 相关文章推荐
Windows下的PHP5.0详解
Nov 18 PHP
PHP SQLite类
May 07 PHP
PHP 开源AJAX框架14种
Aug 24 PHP
由php的call_user_func传reference引发的思考
Jul 23 PHP
简单的PHP缓存设计实现代码
Sep 30 PHP
php实现memcache缓存示例讲解
Dec 04 PHP
PHP缓存机制Output Control详解
Jul 14 PHP
ThinkPHP实现ajax仿官网搜索功能实例
Dec 02 PHP
php实现无限级分类查询(递归、非递归)
Mar 10 PHP
解决yii2左侧菜单子级无法高亮问题的方法
May 08 PHP
laravel 5.4中实现无限级分类的方法示例
Jul 27 PHP
php合并数组并保留键值的实现方法
Mar 12 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 smarty模版引擎中的缓存应用
2009/12/02 PHP
简单的方法让你的后台登录更加安全(php中加session验证)
2012/08/22 PHP
神盾加密解密教程(二)PHP 神盾解密
2014/06/08 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
2019/04/10 PHP
javascript 写的一个简单的timer
2009/07/30 Javascript
扩展jquery实现客户端表格的分页、排序功能代码
2011/03/16 Javascript
JavaScript严格模式禁用With语句的原因
2014/10/20 Javascript
JS实现网页表格自动变大缩小的方法
2015/03/09 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
2015/06/22 Javascript
ztree获取选中节点时不能进入可视区域出现BUG如何解决
2015/12/03 Javascript
js编写三级联动简单案例
2016/12/21 Javascript
详解在Vue中如何使用axios跨域访问数据
2017/07/07 Javascript
前端开发不得不知的10个最佳ES6特性
2017/08/30 Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
2018/08/30 Javascript
[02:36]DOTA2英雄基础教程 帕格纳
2014/01/20 DOTA
python人人网登录应用实例
2014/09/26 Python
Pycharm学习教程(1) 定制外观
2017/05/02 Python
Python中的CSV文件使用&quot;with&quot;语句的方式详解
2018/10/16 Python
python实现图片识别汽车功能
2018/11/30 Python
Python hexstring-list-str之间的转换方法
2019/06/12 Python
python实现控制电脑鼠标和键盘,登录QQ的方法示例
2019/07/06 Python
python pillow模块使用方法详解
2019/08/30 Python
pytorch三层全连接层实现手写字母识别方式
2020/01/14 Python
Python编程快速上手——选择性拷贝操作案例分析
2020/02/28 Python
详解如何在PyCharm控制台中输出彩色文字和背景
2020/08/17 Python
如何删除一个表里面的重复行
2013/07/13 面试题
农民工讨薪标语
2014/06/26 职场文书
加强作风建设工作总结
2014/10/23 职场文书
签订劳动合同通知书
2015/04/16 职场文书
2015年新教师工作总结
2015/04/28 职场文书
2015年司法局工作总结
2015/05/22 职场文书
2015年学校政教工作总结
2015/07/20 职场文书
消防演习感想
2015/08/10 职场文书
求职信如何撰写?
2019/05/22 职场文书
react 路由Link配置详解
2021/11/11 Javascript
天谕手游15杯全调酒配方和调酒券的获得方式
2022/04/06 其他游戏