PHP编程:phpBB BBcode处置的破绽
工具程序用来显示 Rasmus Lerdorf 的个人履历,以及统计网页流量。 bugtraq ID 4432、4434存在成绩的版本:
phpBB 1.44,更低的版本及 phpBB 2.0 未测试。
描写:
phpBB是一个被普遍使用的基于PHP的服装论坛。发明其BBcode中关于“源代码”类的援用处
理存在破绽,经由过程发送特别格局的本义字符串可招致数据库的破坏和办事器的 CPU、内存
资本大批损耗。
具体:
phpBB在对“源代码”类的援用处置不妥,次要是为了要撑持镶套的标志
而酿成的。有成绩的代码是functions.php中的bbencode_code函数。
当咱们提交一个如许的贴子:
实践向数据库中存储的数据是如许:
\0\0\0\0\0\0\0
\0\0\0\0\0\0\0
\0\0\0\0\0\0\0
\0\0\0\0\0\0\0
\0\0\0\0\0\0\0
\0\0\0\0\0\0\0
\0\0\0\0\0\0\0
即实践体系要承当的数据量是输出的“\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! 呈现删不失落的帖子
假如发送镶套的标志则占用资本更多,咱们在实行机械上发送如许的帖子:
以下内容为法式代码\0\0
固然只要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\]/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手册在身上,时不时的摸出来看看,记得,去WC也不能放过(^2^)。 这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己 最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。 有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。 微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox支持的不是很好,所以能少用还是少用的好。 你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。 ,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。 遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。 在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。 ,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。 学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。 兴趣是最好的老师,百度是最好的词典。 其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。 建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。 有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。 其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。 做为1门年轻的语言,php一直很努力。 装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。 写的比较杂,因为我也是个新手,不当至于大家多多指正。 如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
页:
[1]
2