蓝色魔法论坛是一个用PHP编写的论坛,在国内被普遍采用。由于它的用户注册模块中的一些代码缺陷,可以导致恶意攻击者将普通用户提升为管理员。先让我们看看一个入侵的范例吧。
入侵范例
现在假设某个不怀好意的用户知道了这个漏洞,通过分析 http://www.bmforum.com/bmb/这个网站,可以得到其特征代码,大家可以看看页面下方的一段标识,这在很多论坛都很相似。
这就是查找受害者的特征代码了,仔细看一下,我们会发现采用这个论坛代码的网站大部分应该有“Powered by BMForum Plus!”这样的独特标志。把这个特征代码作为关键字,到百度、Google等网站进行搜索,无数的目标凸现在我们眼前。
小提示:特征代码越准确,就越容易找到受害者的论坛。
随便挑选一个有漏洞的论坛,关于这个漏洞我们就不详细描述其原因了,主要缺陷在于过滤不严,通过伪造“|”使程序在读用户等级时将之判断为管理员。单击“注册”按钮,进入注册页面,在填写邮箱地址时,输入 test@test.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这个地址,看看论坛最新的补丁,这也是对自己和客户负责的一种行为。一般来说,论坛代码的普及程度越高,论坛的受攻击可能就越大。众所周知,动网论坛的补丁现在甚至可以和微软媲美了。如果使用的是动网论坛,就必须随时关注其最新安全动态,可以通过动网的论坛、安全杂志、安全网站等,这样可以在最快的时间内了解问题所在,并及时进行防范和解决漏洞。
除了关注官方补丁,如果对问题比较了解,可以直接进行修补。如下面的一行代码,利用正则表达式,判断如果含有javascript就进行拆分,这样就可以有效的消灭跨站式攻击,部分代码修改后如下所示:
if ( $allow['pic']){
$message = preg_replace("//[img/](.+?)/[//img/]/eis","cvpic('/1')", $message);
$message = preg_replace( '/javascript/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对内部网络进行攻击的 防火墙是十分重要的,除此之外,WEB服务器应该说是第二个需要高度安全的领域了。服务器安全由几个安全区域组成,为了保证允许条件下的最高度的安全保护,安全必需在每个区域都予以一致的实现。下面是几个重点防范区域:
基础设施区。基础设施区域定义服务器在网络中的位置,这个区域必需能够防止数据窃听、网络映射和端口扫描等黑客技术的威胁。而且,还应该能跟踪对一个暴露的Web服务器的成功入侵,因为被侵入的服务器可能会用来作为攻击其它重要的服务器的基地,这种方式在DoS攻击中最为常见。另外,还可以通过一个复杂的 防火墙或一个简单的路由器进行规则设置,这样,只有指定的服务器服务才是允许访问的。
网络协议区。网络通信一般指的都是TCP/IP通信,然而,一些函数或者协议的易受攻击点可能会被用来发起攻击或破坏行为。因此,内核必需经过必要的配置,以便阻挡这些类型的攻击手段。针对WEB服务器的一些特点,因此,管理员有必要对症下药,了解一些常用的防范方法。比如,Linux提供了一种称为SYNcookies的最有效解决方案,可以有效的防止SYN洪水攻击。
服务区。服务区定义需要哪些服务。通过安全策略,服务器上仅仅配置完成必要的操作所必需的服务,否则就会为攻击者提供更多的攻击点。比如,对于没有充分认证能力的服务或者传输未经过加密的敏感数据的服务(如Telnet、FTP或通过WWW传输信用卡敏感数据),都应该用更安全的相应服务所替代,如SSH、SSLftp或HTTPS。
应用区。为安全起见,每个服务都必需单独配置。一个配置的不好的邮件服务器可能会被用来发送垃圾邮件,配置不好的WEB服务器可以执行所有的系统命令。
操作系统区。在这里,应该存在一个检测入侵的机制。如果应用区的安全方法配置合理,即使入侵者成功地进入计算机系统也没有足够的管理权限完成破坏工作。程序的安装,尤其是高特权的程序,应该限制在系统操作的绝对需要范围内。当然,也不能忽视经常性地备份,并且不要丢弃旧的备份文件。但有很多人都是使用虚拟主机,没有权限对服务器进行操作,如果要备份数据的话,可以通过论坛管理界面中提供的一些备份手段来进行数据备份。
蓝色魔法论坛还有一个关于暴露Web路径的问题,对于类似的问题,可以考虑关掉其服务器中php.ini里面的display_errors选项。不过,这是在有独立主机或单独的服务器情况下。还可以参考一下其它论坛中的修补方法,如修补phpind论坛的类似问题时,在函数前加一个“@”就不会报错了。这是初始代码:
if(in_array( $tid_db[ $i], $delid)){
修改后的代码为:
if(@in_array( $tid_db[ $i], $delid)){
本文完成之时,网络上的漏洞依然层出不穷,由此导致的后续安全问题依然困绕着我们身边的每位安全管理人员,希望本文的一些建议能够对此起到一定的警醒作用,让大家在复杂的网络中找到自己的立足之地。
入侵范例
现在假设某个不怀好意的用户知道了这个漏洞,通过分析 http://www.bmforum.com/bmb/这个网站,可以得到其特征代码,大家可以看看页面下方的一段标识,这在很多论坛都很相似。
这就是查找受害者的特征代码了,仔细看一下,我们会发现采用这个论坛代码的网站大部分应该有“Powered by BMForum Plus!”这样的独特标志。把这个特征代码作为关键字,到百度、Google等网站进行搜索,无数的目标凸现在我们眼前。
小提示:特征代码越准确,就越容易找到受害者的论坛。
随便挑选一个有漏洞的论坛,关于这个漏洞我们就不详细描述其原因了,主要缺陷在于过滤不严,通过伪造“|”使程序在读用户等级时将之判断为管理员。单击“注册”按钮,进入注册页面,在填写邮箱地址时,输入 test@test.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这个地址,看看论坛最新的补丁,这也是对自己和客户负责的一种行为。一般来说,论坛代码的普及程度越高,论坛的受攻击可能就越大。众所周知,动网论坛的补丁现在甚至可以和微软媲美了。如果使用的是动网论坛,就必须随时关注其最新安全动态,可以通过动网的论坛、安全杂志、安全网站等,这样可以在最快的时间内了解问题所在,并及时进行防范和解决漏洞。
除了关注官方补丁,如果对问题比较了解,可以直接进行修补。如下面的一行代码,利用正则表达式,判断如果含有javascript就进行拆分,这样就可以有效的消灭跨站式攻击,部分代码修改后如下所示:
if ( $allow['pic']){
$message = preg_replace("//[img/](.+?)/[//img/]/eis","cvpic('/1')", $message);
$message = preg_replace( '/javascript/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对内部网络进行攻击的 防火墙是十分重要的,除此之外,WEB服务器应该说是第二个需要高度安全的领域了。服务器安全由几个安全区域组成,为了保证允许条件下的最高度的安全保护,安全必需在每个区域都予以一致的实现。下面是几个重点防范区域:
基础设施区。基础设施区域定义服务器在网络中的位置,这个区域必需能够防止数据窃听、网络映射和端口扫描等黑客技术的威胁。而且,还应该能跟踪对一个暴露的Web服务器的成功入侵,因为被侵入的服务器可能会用来作为攻击其它重要的服务器的基地,这种方式在DoS攻击中最为常见。另外,还可以通过一个复杂的 防火墙或一个简单的路由器进行规则设置,这样,只有指定的服务器服务才是允许访问的。
网络协议区。网络通信一般指的都是TCP/IP通信,然而,一些函数或者协议的易受攻击点可能会被用来发起攻击或破坏行为。因此,内核必需经过必要的配置,以便阻挡这些类型的攻击手段。针对WEB服务器的一些特点,因此,管理员有必要对症下药,了解一些常用的防范方法。比如,Linux提供了一种称为SYNcookies的最有效解决方案,可以有效的防止SYN洪水攻击。
服务区。服务区定义需要哪些服务。通过安全策略,服务器上仅仅配置完成必要的操作所必需的服务,否则就会为攻击者提供更多的攻击点。比如,对于没有充分认证能力的服务或者传输未经过加密的敏感数据的服务(如Telnet、FTP或通过WWW传输信用卡敏感数据),都应该用更安全的相应服务所替代,如SSH、SSLftp或HTTPS。
应用区。为安全起见,每个服务都必需单独配置。一个配置的不好的邮件服务器可能会被用来发送垃圾邮件,配置不好的WEB服务器可以执行所有的系统命令。
操作系统区。在这里,应该存在一个检测入侵的机制。如果应用区的安全方法配置合理,即使入侵者成功地进入计算机系统也没有足够的管理权限完成破坏工作。程序的安装,尤其是高特权的程序,应该限制在系统操作的绝对需要范围内。当然,也不能忽视经常性地备份,并且不要丢弃旧的备份文件。但有很多人都是使用虚拟主机,没有权限对服务器进行操作,如果要备份数据的话,可以通过论坛管理界面中提供的一些备份手段来进行数据备份。
蓝色魔法论坛还有一个关于暴露Web路径的问题,对于类似的问题,可以考虑关掉其服务器中php.ini里面的display_errors选项。不过,这是在有独立主机或单独的服务器情况下。还可以参考一下其它论坛中的修补方法,如修补phpind论坛的类似问题时,在函数前加一个“@”就不会报错了。这是初始代码:
if(in_array( $tid_db[ $i], $delid)){
修改后的代码为:
if(@in_array( $tid_db[ $i], $delid)){
本文完成之时,网络上的漏洞依然层出不穷,由此导致的后续安全问题依然困绕着我们身边的每位安全管理人员,希望本文的一些建议能够对此起到一定的警醒作用,让大家在复杂的网络中找到自己的立足之地。