随着防火墙技术的发展以及人们对服务器本身的安全性的重视,未来的主流攻击方向将逐渐转向Web端口.CGI程序本身的安全性是程序员的事情,这对于某些管理员来说他们是无能为力的.但我们仍然可以通过正确合理的配置,使我们的Web服务器降低CGI程序本身安全问题所带来的各种威胁.本文便是从CGI安全角度来描述了两种主流的Web服务器(IIS和APACHE)的具体配置,相信这样配置之后,我们的服务器安全性会得到很大提高.
一、Windows IIS环境
由于Wmdows+IIS+CGT本身的安全性并不好,所以会出现的问题比较多。好比说PsKey最近发现的一批LB5000论坛的漏洞吧,这些漏洞都是基于Windows+IIS平台的。因为在Windows+IIS环境中,CGI程序文件权限没有可执行相和不可执行一说。所以,只要是在有脚本执行权限的虚拟目录里,CGT文件都会被执行。这就带来了很多安全上的问题。PsKey发现的几个漏洞都是往.CGI文件里写入符合Peri语法的语句,来构造一个小型的WebShell。而对于一个功能强大的CGI程序来说,其自然不可能面面俱到,多多少少部会存在一些问题也属正常。但只要控制好虚拟目录的权限,危险性将会大大降低。
现在我们以LB为例"对于LB来说,它本身很多地方已经做得很好了,但其安全问题大多就是由干对一些字符的过滤不严所造成的。在IIS中默认情况下,子目录将继承父目录的权限,如果一个目录被设置了 "脚本和可执行程序"权限,那么其子目录也将有"脚本和可执行程序"权限。所以,只要将LB5000论坛所在目录设置为可执行,将其子目录全设为不可执行。这些问题就迎刃而解了。因为即使你可以往其子目录的一些文件里写入WebShell。但由于子目录没有执行权限,一样没用。
LB的CGI程序和数据文件结构是这样设计的:将需要执行的CGI程序文件与一些.cgi后缀的数据文件放在不同的目录中。我们强烈建议写程序时这样做,因为这样。管理员就只需要按照要求去设置虚拟目录的权限了
现在,让我们来一步一步对IIS虚拟目录进行设置吧.
1.开始→运行,输入:%SystemRoot%System32Intestrviis.msc打开 "Intenet服务管理器"。
2.选中将要设置的门IIS虚拟目录。点右键→属性,将LB论坛的cgi-bin目录设置为许执行"纯脚本"。
3.然后再逐一对cgi-bin目录的子目录进行设置,比如cgi-bin/data目录进行设置,选中data目录,点右键→属性,将可执行设置为"无",这样一来.在此目录中的CGT程序将不允许被执行。
按照这个方法。将cgi-bin目录下的每一个子目录的可执行权限都设置为 "无"。最后,还要将non-cgi目录进行设置,一般也将可执行权限设置为 "无"。
好了,我们对论坛的目录权限设置就结束了。这样一来,即使论坛再被发现有什么过滤不严密的漏洞只要他无法执行被窍人WebShell的文件。一样不能达到人侵的目的。但我不敢保证就不出现任何问题,因为对于CGI漏洞的攻击千奇百怪,出其不意,很难说将来会不会出现什么新的攻击方法。但是,这样设置绝对可以很大程度地降低CGI程序本身所带来的威胁。
二、Windows十APACHE环镜
由于默认安装APACHE服务器建以SYSTEM仅限启动。这一点它和IIS不同。在IIS中,如果CGI程序解释程序不在LM/W3SVC/InProcessIsapiApps中的话。它的权限疑继:敢DLLHOST.EXE;的IWA.M_-MACHINENAME权限。但APJACHE一旦启动,所有的CGI程序都会继承apache.ex.e的SYSTEM权限,所以距危险。一旦一个CGT程序出现问题。那么服务器将完全被控制。如果你真的想在Windows上跑APACHE的话,强烈建议另建一个CUESTS组的用户,用这个新建的用户启动APACHE服务。这种情况下对CGI程序本身来说。安全性要比IIS中稍好些。因为APACHE中,CGI程序的解释器是在程序的首行定义的,如:#!c:/perl/bin/perl,而IIS则是是在LM/W3SVVC/ScriptMaps中。如果商行没有定义,那么CGI程序运行将出错。所以。如果要想利用程序漏洞写出一个可以成功执行的WebShell是有一定难度的,但这并不代表不可以。我在测试中发现,其实首行不需要定全路径的,写成这样也可以:#!peri。因为在安装ActivePerl的时候,其会在环境变量的PATH中自动加上peri.exe的路径。所以我们成功利用这种漏洞的困难减少了。当然在这种环境下,我们也可以对APACHE配置文件httpd.conf进行合理的配置以降低来自CGI程序本身带来的威胁.
下面我们来对APACHE服务及其配置文件httpd.conf进行配置。
1.在正确安装好APACHE服务器后,新建一个用户。并将其从原来的USERS组中删除,将它加到GUESTS组中,命令如下;
net user apacheuser newpassword/add
net localgroup users apacheuser/del
net localgroup guests apacheuser/add
2.将APACHE安装目录(如:C:apache)的权限设置为apacheuser只读和执行,其他非administrators组用户拒绝访问,还要将C:apachelogs目录设置为可写和可修改,不然APACHE会运行出错,不能启动.命令如下:
3.现在再让APACHE服务以这个新建的用户apacheuser来启动.开始→运行,输入:Services.msc选中apache服务这一项,然后点右键→属性→登录→此帐户→浏览,选择我们刚才新建的那个用户(这里是以apacheuser这个用户为例),在下面的密码框中输入用户名的密码(这里是newpasswork),然后一路"确定"下去.
这样.APACHE服务就设置好了,接着,我们再来对httpd.conf进行设置,还是以LB5000论坛为例.我们要对LB的每个目录进行详细的设置,需要在httpd.conf文件中添加一些内容.
4.先设置cgi-bin目录如下:
ScriptAlias/LB5000/cgi-bin/"d:/inetpub/wwwroot/LB5000/cgi-bin/"
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
5.然后再一一设置其子目录,这里只以cgi-bin/data目录为例,其他的以此类推:
Alias/LB5000/cgi-bin/data/"d:/inetpub/
wwwroot/LB5000/cgi-bin/data/"
cgi-bin/data">
AllowOverride None
Options None
Order allow,deny
Allow from all
6.最后别忘了设置non-cgi目录:
Alias/LB5000/non-cgi/"d:/inetpub/wwwroot/LB5000
non-cgi/"
AllowOverride None
Options None
Order allow,deny
Allow from all
到这里,Windows环境下的APACHE基本上设置好了。
三、Linux/Unix+APACHE环境
这种环境相对于前两种来说,安全性高得多。首先,一个CGI程序要执行,那么在文件系统当中必须要有可执行权限,即+x。你有能力往.cgi文件里写一个完整的WebShell,但并不代表你可以让它有执行权限。其次,还要在虚拟目录里定义可执行。所以,这种配置的CGI程序安全问题大多数都出在提交非法数据暴露敏感文件以及直接执行程序等方面。而这些就与配置关系不大了,所以我也就不赘述了。
后记
好了,经过上两的详细配置之后,应该说可以增强Web服务器的安全性。但也不一定就很安全了。这还要看CG,程序的结构。一般的编写结构是这样的,把所有需要执行的程序集中放到一个目录、在配置Web服务器时给这个目录执行脚本的权限。其他所有目录都不要给执行脚本的权限。所有需要读写的数据文件集中放到另一个目录。在设置虚拟目录时不要给这个目录任何权限。如有必要也可以将它放到Web目录以外的目录。将一些自已写的模块文件和函数文件集中放到一个目录,设置虚拟目录时不要给任何权限,包括访问权限。到这里,关于Web服务器的配置就差不多了。本人对CG1的研究也非常有限,希望这篇文量能起到抛砖引玉的作用。