从PHP论坛漏洞窥安全管理

来自:ReJeCt‘s Blog

蓝色魔法论坛是一个用PHP编写的论坛,在国内被普遍采用。由于它的用户注册模块中的一些代码缺陷,可以导致恶意攻击者将普通用户提升为管理员。先让我们看看一个入侵的范例吧。

入侵范例
现在假设某个不怀好意的用户知道了这个漏洞,通过分析http://www.bmforum.com/bmb/这个网站,可以得到其特征代码,大家可以看看页面下方的一段标识,这在很多论坛都很相似。
这就是查找受害者的特征代码了,仔细看一下,我们会发现采用这个论坛代码的网站大部分应该有“Powered by BMForum Plus!”这样的独特标志。把这个特征代码作为关键字,到百度、Google等网站进行搜索,无数的目标凸现在我们眼前。
小提示:特征代码越准确,就越容易找到受害者的论坛。
随便挑选一个有漏洞的论坛,关于这个漏洞我们就不详细描述其原因了,主要缺陷在于过滤不严,通过伪造“|”使程序在读用户等级时将之判断为管理员。单击“注册”按钮,进入注册页面,在填写邮箱地址时,输入test at test dot com|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|,通过认证后,这个刚注册的新用户就变成了管理员。而这个步骤是如此简单,加上管理员的权限又大,其危害可想而知。
进入“管理中心”,就可以看到管理页面了。在这里,恶意的用户可以做很多事情,比如上传文件构造一个WebShell,上传文件表单即可由用户直接构建。试想,如果管理员知道自己的网站可以被别人这么折磨,其表情想象有多么难看。
实际上,看看网络上到处横行的论坛漏洞,无论是ASP、JSP还是PHP,类似的问题都可能存在。那么,如何进行有效的防范呢?

防范措施
1.密切关注官方补丁
很多使用ASP或者PHP等语言的开发者都有一个不好的习惯,用了别人的代码后就以为万事大吉了。实际上这是一个很大的隐患,因为代码是别人写的,代码的安全问题也只有别人才知道,也许,当某天在自己的论坛上突然收到开发者发来的紧急消息时,我们除了惊讶以外,还可能会有一种被出卖的感觉。因此,关于代码的安全,可以从以下两个角度来分析。
以本文的蓝色魔法论坛为例,可以登录其官方站点http://www.bmforum.com,找到补丁相关的栏目,如http://www.bmforum.com/bmb/forums.php?forumid=4这个地址,看看论坛最新的补丁,这也是对自己和客户负责的一种行为。一般来说,论坛代码的普及程度越高,论坛的受攻击可能就越大。众所周知,动网论坛的补丁现在甚至可以和微软媲美了。如果使用的是动网论坛,就必须随时关注其最新安全动态,可以通过动网的论坛、安全杂志、安全网站等,这样可以在最快的时间内了解问题所在,并及时进行防范和解决漏洞。
除了关注官方补丁,如果对问题比较了解,可以直接进行修补。如下面的一行代码,利用正则表达式,判断如果含有&#106avascript就进行拆分,这样就可以有效的消灭跨站式攻击,部分代码修改后如下所示:
if ($allow[‘pic’]){
$message = preg_replace(“/\[img\](.+?)\[\/img\]/eis”,”cvpic(‘\1’)”,$message);
$message = preg_replace( ‘/&#106avascript/i’, ‘java script’, $message);
}else{
2.阅读代码并理解代码
现在,由于很多论坛的安装十分智能化,很多使用者也懒得去看代码是如何实现功能的,直接点击“下一步”或者直接上传到服务器上就万事大吉了。这其实是一个不好的习惯,知其然的同时也要知其所以然,通过仔细阅读并理解代码,才能真正找到出现问题的地方。
比如,在Web程序中,数据库的安全是一个很严肃的问题。很多代码的编写者意识到了这类问题,并且小心翼翼地对他们认为有问题的地方做了补救,但常见的情况是要么没有穷尽所有的可疑地点,要么这种补救逻辑上有误。对于一个耐心且嗅觉灵敏的攻击者来说,这种意义上的补救措施和没有任何补救措施没有本质上区别。
常见的输入变量有三种:数字,字符串还有集合。对于数字型的输入变量,简单调用一下判断函数即可,见得到的代码中,凡是检查了这类变量的,几乎都正确。对于字符串型的来说,基本上在插入到生成的SQL语句时,前后都有单引号,如果仅从破坏注入条件来看,把单引号替换成两个单引号应该问题不大。同理,如果是一个字符串的集合,也可以简单的用这种方法。而如果是数字的集合,情况可能稍微麻烦一点,至少你得允许数字、逗号或许还有空格之类的符号在输入中正常出现,这样子的过滤规则可能显得复杂。
典型例子是不管不顾地对所有的输入变量都去掉单引号,或者是把单引号替换成合法的两个单引号,例如:
id = replace(request.querystring(“id”), “‘”, “”)
这个做法很有可能是错误的。因为引起SQL注入的不总是单引号,再扩大一点,引起问题的不是任何单独的符号。正确的利用注入,重要的一点是闭合前面的一句SQL查询语句,往往是得先正确地闭合前面一个条件,因为我们可能会在同一句里面引入新的条件,补救措施只要破坏注入条件应该就可以了,但是考虑到其复杂性,最好还是较为完整的限制一下输入的字符种类。这就需要在实际代码中多多留心一下了。因此,在使用对方提交的数据之前,先做一个对方所有可能进入字符的分析列表,然后就每一种输入分支情况进行类型的审核,这也是每个代码使用者所应该了解的一些基本防范规则。

3.检查网站安全日志和后门文件
一般来说,入侵者总会或多或少的留下一些蛛丝马迹。下面,我们来查找一下。蓝色魔法论坛有一个“安全日志”栏目,这里面记录了一些登录的信息。即使攻击者清空了信息,依然会留下一条类似的记录:“清空论坛安全日志”,作为一个聪明的管理员,应该可以从中看到一些入侵的迹象,而不是蒙在鼓里受罪。另外,根据分析,我们发现,这个版本的论坛对24小时内进入管理员界面的用户也有记录。
打完补丁并不代表问题已经解决了。攻击者很可能已经上传了一些网页木马程序或者修改了系统的一些设置,这就需要查看其中改动的部分了。如前不久所产生的动易上传漏洞中,一个变量的出错就导致了上传漏洞的产生。因为asp (后面有空格)是不等于asp(后面没有空格)的,而Windows对于碰到有空格的文件会自动去掉空格,所以当攻击者上传一个“asp ”(有空格)的文件就会变成一个asp(没有空格)的文件。针对这种情况,就要仔细查看各上传文件的保存目录中是否存在asp、asa、cdx、cer、aspx等扩展名的文件,如果已经存在,说明已经被上传了木马,实在没有把握的情况下,就要删除所有ASP文件,然后重新下载官方文件覆盖。
这也间接告诉我们,在论坛上注册资料的时候,一定要注意保护个人重要信息。如果攻击者得到了这些信息,比如具体的生日或者密码问题答案,他就可以轻易的更改用户的邮箱密码。是通过论坛获取的用户资料来破解的一个邮箱,通过重新设置密码,这个用户的邮箱资料就完全掌握在攻击者手中了。
4.多级加强WEB服务器安全
在网络安全领域,用于防止从Internet对内部网络进行攻击的防