经过第一,二部分的学习我们已经了解到了IIS+MySQL+PHP的基本配置过程和Windows的基本权限设置。这一部分我们需要讨论php的安全配置还有Web目录的安全配置,当然也必须有IIS的变态安全配置了。我这里先废话几句。
我们最终的目标是Web站点只运行php,不支持asp不支持asp.net,让特定的目录或者子网站不能执行php脚本,例如图片目录,我们对它设置成不能运行php,这样就算您的网站被“黑客”登录了后台,能上传文件。但是最终他也不能执行webshell。
就算拿到了webshell,他也不能读目录或者文件,不能执行命令。换句大话就是说强大的webshell在黑客手上没有任何的利用价值,让黑客最终直接抓狂而死。呵呵!其实做到这一点不是非常的难,跟随我的脚步来吧。学完本文章你就能独立的完成这样的变态的服务器配置了。
一、php.ini文件变态配置
我们为什么把php.ini放在最前面写呢,因为我们的Web网站是php的,所以很多默认的选项是不安全的。给黑客留下了非常多的可利用机会,所以第一步我们必须要把php.ini设置的变态些,这样就能阻止一般脚本黑客的攻击了。
我们首先来了解一些php.ini的基本概念性。空白字符和以分号开始的行被简单地忽略。设置指令的格式如下:directive = value 指令名(directive)是大小写敏感的!所以"foo=bar"不同于"FOO=bar"。值(value)可以是:
1. 用引号界定的字符串(如:"foo")
2. 一个数字(整数或浮点数,如:0,1,34,-1,33.55)
3. 一个PHP常量(如:E_ALL,M_PI)
4. 一个INI常量(On,Off,none)
5. 一个表达式(如:E_ALL & ~E_NOTICE)
还有另外一个是设置布尔值,1为On就是开启,0为Off就是关闭。php.ini分了很多部分,例如:模块部分,php全局配置,数据库配置,等等。如图1所示是一个基本的php.ini的例子。了解了基本的概念以后我们就可以开始变态配置之旅。
|
图1 |
第一个重要的参数是register_globals. 这个配置影响到php如何接收传递过来的参数,说白了register_globals的意思就是注册为全局变量,所以当该参数为值On的时候,传递过来的值会被直接的注册为全局变量直接使用,而当该参数值为Off的时候,我们需要到从特定的数组里去得到它。从www.milw0rm.com很多的php漏洞来看一大部分是因为Register_Globals为On的时候被利用的,所以强烈推荐将这个参数修改成Off,php目前的最高版中此参数都是默认是Off的,没啥说的了,如果你用的版本比较老的话一定要修改这里。
第二个重要的参数是magic_quotes_gpc。如果你把magic_quotes_gpc设置成了Off,那么php就不会对4种字符' (单引号), " (双引号), \ (反斜线) 和 空字符进行转义,那这样的话就会造成服务器可能会被非法注入的可能。但是如果你把Magic_quotes_gpc设置成On的话,php就会给$_POST,$_GET,$_COOKIE提交的变量中如果有上面四种字符的话就会加上\反斜扛.这样就会大大地提高php的安全性。强烈推荐将Magic_quotes_gpc设置为On。
第三个比较重要的是display_errors。为什么说这个参数重要呢,因为没有不会犯错误的开发者,php的display_errors参数就是帮助开发者定位和确定这些错误的。可是如果php提供的这些信息被黑客了解到的话,这就不妙了。如图2所示为某国库的网站,因为对display_errors没有进行设置,导致web目录泄露。这对于黑客来说可是非常重要的信息,因为很多时候的渗透都需要知道web目录,例如webshell的写入等等。所以我们强烈推荐大家把这个参数设置成Off。
|
图2 |
第四个重要的参数就是safe_mode,就是我们常说的安全模式。php的安全模式是个非常重要的内嵌的安全机制,能够控制一些php中的函数,比如system()等函数,同时把很多文件操作函数进行了权限控制,也不允许对某些关键文件的访问,比如/etc/passwd,但是默认的php.ini是没有打开安全模式的,我们把它打开。safe_mode = on。
第五个参数是open_basedir,使用open_basedir选项能够控制PHP脚本只能访问指定的目录,这样能够避免PHP脚本访问不应该访问的文件,一定程度上限制了webshell的危害,我们一般可以设置为只能访问网站目录(假设网站目录为E:\test):open_basedir = E:\test 第六个参数是disable_functions,使用disable_functions可以限制一些对于系统来说威胁很大的函数。
例如,我们在第一部分中看到的有phpinfo()函数的网页中可以看到关于php的环境变量等。还有可以利用system,exec等函数来执行系统命令等等。这里我们推荐过滤的函数如下。disable_functions = phpinfo,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server。大家如果对某个函数不了解的话,可以google搜索得到函数的作用,然后来决定您自己的服务器是否禁止掉。
第七个参数是Com组件。Windows平台下的PHP脚本平台存在一个安全漏洞,使得PHP设置即使在安全模式下(safe_mode),仍旧允许攻击者使用COM()函数来创建系统组件来执行任意命令。漏洞出现的原因是由于在安全模式下的PHP平台虽然system();pathru()函数被禁止,但是com.allow_dcom的设置依旧是为true。以至于攻击者可以使用COM()函数创建系统组件对象来运行系统命令。
如果是默认的Apache设置或者Web服务器以Loacalsystem权限或Administrators权限运行,攻击者可以使用这个漏洞来提升权限。所以我们必须要关闭掉com.allow_dcom这个参数默认是True,我们需要吧这个参数修改成com.allow_dcom=false。第八个参数是expose_php。这个参数决定是否暴露 PHP 被安装在服务器上。如图3所示,如果这个参数设置为On的话就会把php的版本等泄露出来了。我们的推荐值是Off。
|
图3 |
基本上的参数我们就介绍完了,当然php.ini还需要配置,大部分设置跟安全是没有关系的,很大一部分都跟PHP运行的效果(例如优化)等有关系,如果大家有兴趣的话可以自己参考一下php的官方手册来具体了解一下。注意:修改完php.ini以后,必须重新启动IIS,不然你设置的内容不会即时生效。
二、 IIS变态配置
我们配置完了php.ini,虽然已经算是相当安全了。但是毕竟最重要的设置还是在IIS上面,IIS可以限制某些用户的登录,同时也可以为数据增加SSL(安全套接层)来增强数据在传输过程中的安全性。可以利用IIS限制某些应用程序例如php的执行规则,例如,让php只能运行在指定的目录中,其他的目录是不能执行php的。下面举个例子就好理解了,例如:www.sina.com这个网站,大家都知道的,这个是新浪的。
新浪每天的访问量是非常大的,所以他不可能把所有的东西都放在一个服务器上面,这个时候可能就会把特定的资源例如图片,视频等放到一个专门的服务器上。这个时候,新浪的安全管理员就做了个非常变态的策略,就是在这些提供特定资源的服务器上面不能运行任何的脚本,例如不能执行php等,当然我这里只是举个例子,因为大部分的新浪的服务器都是Linux系列的,在他上面跑的可能是Nginx或者是apache,apache的这部分设置我们会在以后的教程中涉及。
所以希望大家关注我写的文章啊,呵呵!第一个变态的服务器配置.我们继续来讨论IIS.基本的配置请参考第一部分的文章,这里我们就不多说废话了,我们第一个实现的功能是特定的php目录或者是网站不能运行php。如图4所示是我们的网站和网站的资源。划线部分是我们的目录,这里我新建一个目录例如images目录,然后在images目录下建立一个2009.php的文件,内容是phpinfo,如图5说明我们正常执行了。我们要达到的目的是让这个目录不支持php的执行.下面我们来看一下如何实现的。我们有两种办法。
第一种是首先打开IIS信息服务管理器,打开我们的网站,然后找到我们刚才新建的目录,右键点击目录属性,如图6所示。我们看划红线的地方,这里有三个选项,分别是无,纯脚本,还有一个是脚本和可执行文件。这里我们选择无,然后单击“确定”按钮。如图7所示,我们再刷新一下就会看到2009.php不可以运行了。
第二种办法是利用应用程序池来配置,具体的实现方法为:如图8所示,我们选择画红线的部分,然后就创建了一个和网站名字一样的应用程序池,然后我们单击“配置”按钮出现如图9所示的画面,我们这里把.php的扩展去掉。如图10所示,我们的脚本不能运行了,出现了404的错误,但是我们访问图片还是一样可以访问,如图11所示。当然上面的配置也可以用于特定的服务器,例如,您的公司规模比较大,需要建立一个专门的图片服务器来缓解主服务器的负载,就可以使用这个很变态的方法。
|
图4 |
|
图5 |
|
图6 |
|
图7 |
|
图8 |
|
图9 |
|
图10 |
|
图11 |
第二个变态的服务器配置相信一部分人都知道就是给特定的目录上集成Windows 2003的身份验证功能,例如后台的设置。一个很常见的场景如下:如果我的后台目录是admin的话,我这里有2个验证用户和密码。
第一道防护是服务器上的集成身份验证,就是给服务器上添加一个用户,然后设置一个非常变态的密码。
第二道防护就是网站本身的用户名和密码,当然这两道防护的密码一定不能相同,不然跟没用一样。下面,我们来实现一下这个功能。例如,我们要配置的目录是admin,右键点击admin的属性,如图12所示,我们单击“身份验证和访问控制”下的“编辑”按钮,弹出如图13所示的对话框,我们选择“集成windows身份验证”就可以了,同时去掉“启用匿名”前面的对勾,然后单击“确定”按钮。我们再次访问后台目录就会出现了如图14所示的画面,要求我们输入windows服务器上的用户名和密码。
我们现在新建一个本地的用户,然后把他的权限设置为最小的。我们单击开始菜单 -> 运行 -> 输入cmd,然后在cmd中输入net user test test /add。添加一个用户,这一步没啥说的。下面讲解如何降低test用户的权限,右键点击“我的电脑”,选择“管理”,弹出“计算机管理”对话框,如图15所示,选择右键单击刚才新建的test用户选择“属性”,我们选择用户“密码永不过期”,然后选择拨入选择拒绝访问.点确定,回到刚才的目录中,我们输入我们新建的用户就可以查看了。
|
图12 |
|
图13 |
|
图14 |
|
图15 | 第三个配置就是服务器只支持php其他任何脚本都不支持。这个很容易就实现了,我们不说废话,如图16所示就可以搞定了,只留下php就可以了,其他全部删除。当然如果您的服务器需要支持asp和asp.net的话只留下asp,asp.net和php就行了。其他全部删除即可。
|
图16 |
三、web目录的变态权限配置
其实我们在第2部分的时候已经涉及到了基本的权限配置原则等,这里我们只是做一些扩展。例如,我们的网站的目录是E:\test。右键单击目录,选择“属性”,弹出如图17所示对话框,我们把IUSR_计算机名添加进来,这个账号是IIS匿名用户的访问账号。
注意画长方形的地方一定不要选择。不然黑客就能上传webshell到你的目录了。但是这样设置的话是不行的,例如你的网站需要上传图片的时候,这样你自己也不能上传了,这个时候我们需要把图片目录设置成可写的,如图18所示。同时结合我们第2部分中学习的IIS变态设置,把这个目录设置成不能执行php的。这样就达到了目录的变态配置目的了。
|
图17 |
|
图18 |
四、总结
到这里我们已经把Windows+PHP+IIS+MYSQL的变态安全课程讲完了,纵观本文章,我们可以了解到IIS+MYSQL+PHP的基本配置,NTFS的安全配置等安全配置。这样我们就得到了一个比较高水平的而且安全的服务器了,但是仅这些内容是远远不够的,因为Windows系列不仅包含web服务,还有很多其他的服务,例如FTP的安全,还有组策略等我们都没有涉及。
如果以后有机会的话,我绝对会跟大家继续讨论有关于Windows整体安全性。谢谢大家的关注,如果您有什么问题或者是建议的话请联系我,我在安天365论坛(http://www.antian365.com/bbs)的ID是cnbird。【51CTO.COM 独家特稿,转载请注明出处及作者!】
|