黑客攻防从入门到精通(Web技术实战篇)
上QQ阅读APP看书,第一时间看更新

3.4 应用于Web应用程序的防范技术

在本章中,我们已经介绍了多种针对Web应用程序的攻击和防范对策,但是没有一本能够包含所有Web平台攻击的完备目录。本节我们要总结全面加固Web平台最重要的几个方面,以及目前最流行的Web平台IIS、Apache和PHP上存在的漏洞和防范技术。

3.4.1 适用于任何应用程序的防范技术

如今的Web应用程序可能会包含危险的安全缺陷,这些应用程序的全球化部署使其很容易遭受攻击,而这些攻击会发现并恶意探测各种安全漏洞。

Web应用程序需要有深度防御的措施来避免和减少安全性漏洞。这种方式假设所有的安全预防措施都可能失败,所以安全性依赖于多层的机制从而能够覆盖其他层的失败。为了减少成功攻击的可能性,我们必须做出必要的努力来引入适当的安全性防护措施。要达到这一点,必须使用各种技术和工具来确保安全性涵盖整个Web应用程序。

1.应用最新的安全补丁

维护强壮和安全的Web平台最有效的方法是保证系统具备最新的安全补丁。这没有捷径,你必须持续地为平台和应用打上补丁。尽管你可以采取许多其他的操作来更好地加固系统抵御攻击,但是在安全更新公布时应用到你的系统中是你所能做的最重要的事情。

2.不要在源代码中放入私有数据

(1)ASP脚本中不要用明文SQL连接串。

(2)在应用配置文件中不要使用明文密码,始终避免在global.asa或web.config等应用配置文件中使用明文密码。

(3)不要使用带有.inc扩展名的包含文件,将包含文件改名为.asp、 .php或者对你的Web应用平台来说合适的扩展名。

(4)不要在脚本中写入包含私有信息如电子邮件地址、目录结构信息和密码的注释,不要编写易受攻击的文档;确保删除可能用来针对你的Web平台和应用信息。

3.定期扫描网络中的脆弱服务器

避免这些危害的最佳机制是定期扫描可能引发这些危害的漏洞。有许多非常有用的Web应用评估产品,如HP WebInspect(如图3-23所示)和Watchfire AppScan(如图3-24所示),这些产品都能很好地识别Web平台、应用和配置漏洞。

图3-23 HP WebInspec安全评估工具操作界面

图3-24 Watchfire AppScan应用安全测试工具

4.了解遭到攻击的迹象

最后,也可能是最明显的,Web服务器日志常常是第一个显示未授权活动的地方。将分析日志文件作为标准操作程序的一部分常常能帮助你检测攻击和入侵。

3.4.2 应用于IIS的防范技术

IIS是一种Web服务组件,其中包括Web服务器、FTP服务器、NNTP服务器和SMTP服务器,分别用于网页浏览、文件传输、新闻服务和邮件发送等方面,它使得在网络(包括互联网和局域网)上发布信息成了一件很容易的事。

截至2015年4月15日,全球部署IIS的系统数量大概有444万余个。以占比最大的IIS 7.5(42.3%)为例,美国、中国、英国及德国为分布广泛的稠密区域,其中中国占比16.4%, IIS.7.5的部署量超过35万个。

微软的产品一向是众矢之的,因此IIS服务器特别容易成为攻击者的靶子。搞清楚了这一点后,我们必须准备执行大量的安全措施,来保证搭建在IIS服务器上的Web应用程序是安全的。

Internet信息服务(IIS)管理器如图3-25所示。

图3-25 Internet信息服务(IIS)管理器

1.保持Windows升级

你必须在第一时间及时地更新所有的升级,并为系统打好一切补丁。考虑将所有的更新下载到你网络上的一个专用的服务器上,并在该机器上以Web的形式将文件发布出来。通过这些工作,可以防止你的Web服务器接受直接的Internet访问。

2.使用IIS防护工具

这个工具有许多实用的优点,然而,请慎重地使用这个工具。如果你的Web服务器和其他服务器相互作用,请首先测试一下防护工具,以确定它已经被正确地配置,保证其不会影响Web服务器与其他服务器之间的通信。图3-26为网站安全狗防护工具。

图3-26 网站安全狗(IIS版)——网站安全防护工具

3.移除默认的Web站点

很多攻击者瞄准inetpub这个文件夹,并在里面放置一些偷袭工具,从而造成服务器的瘫痪。防止这种攻击最简单的方法就是在IIS里将默认的站点禁用。然后,因为网虫们都是通过IP地址访问你的网站的(他们一天可能要访问成千上万个IP地址),他们的请求可能遇到麻烦。将你真实的Web站点指向一个背部分区的文件夹,且必须包含安全的NTFS权限。

4.卸载不需要的服务

进入计算机的最简单途径就是通过FTP访问。FTP本身就是被设计满足简单读/写访问的,如果你执行身份认证,你会发现你的用户名和密码都是通过明文的形式在网络上传播的。SMTP是另一种允许到文件夹的写权限的服务。通过禁用这两项服务,你能避免更多的黑客攻击。

5.有规则地检查你的管理员组和服务

检查IIS服务器上的服务列表并保持尽量少的服务必须成为你每天的任务。你应该记住哪个服务应该存在,哪个服务不应该存在。Windows 2000 Resource Kit带给我们一个有用的程序,叫作tlist.exe,它能列出每种情况运行在svchost之下的服务。运行这个程序可以寻找到一些你想要知道的隐藏服务。给你一个提示:任何含有daemon几个字的服务可能不是Windows本身包含的服务,都不应该存在于IIS服务器上。

6.严格控制服务器的写访问权限

这听起来很容易,然而,在大学校园里,一个Web服务器实际上是有很多“作者”的。教职人员都希望他们的课堂信息能被远程学生访问;职员们则希望与其他的职员共享他们的工作信息。服务器上的文件夹可能出现极其危险的访问权限。将这些信息共享或是传播出去的一个途径是安装第二个服务器以提供专门的共享和存储目的,然后配置你的Web服务器来指向共享服务器。这个步骤能让网络管理员将Web服务器本身的写权限仅仅限制给管理员组。

7.设置复杂的密码

如果有用户使用弱密码(如“password”或“adminlogin”或者任何字典单词),那么黑客能快速并简单地入侵这些用户的账号。

8.减少/排除Web服务器上的共享

如果网络管理员是唯一拥有Web服务器写权限的人,就没有理由让任何共享存在。共享是对黑客最大的诱惑。此外,通过运行一个简单的循环批处理文件,黑客能够查看一个IP地址列表,利用\命令寻找Everyone/完全控制权限的共享。

9.禁用TCP/IP协议中的NetBIOS

一方面,很多用户希望通过UNC路径名访问Web服务器,但随着NetBIOS被禁用,他们便不能这么做了。另一方面,随着NetBIOS被禁用,黑客就不能看到你局域网上的资源了。这是一把双刃剑,如果网络管理员部署了这个工具,下一步便是指导Web用户如何在NetBIOS失效的情况下发布信息。

10.使用TCP端口阻塞

如果你熟悉每个通过合法原因访问你服务器的TCP端口,那么你可以进入你的网络接口卡的“属性”选项卡,选择绑定的TCP/IP协议,阻塞所有你不需要的端口。你必须小心地使用这一工具,因为你并不希望将自己锁在Web服务器之外,特别是在当你需要远程登录服务器的情况下。

11.仔细检查.bat和.exe文件

每周搜索一次.bat和.exe文件,检查服务器上是否存在黑客最喜欢而对你来说将是一场噩梦的可执行文件。在这些破坏性的文件中,也许有一些是.reg文件,如果你右击并选择编辑,你可以发现黑客已经制造并让他们能进入你系统的注册表文件。你可以删除这些没有任何意义但会给入侵者带来便利的主键。

12.管理IIS目录安全

IIS目录安全允许你拒绝特定的IP地址、子网甚至是域名。作为选择,我选择了一个被称为WhosOn的软件,它让我能够了解哪些IP地址正在试图访问服务器上的特定文件。WhosOn列出了一系列的异常。如果你发现一个家伙正在试图访问你的cmd.exe,你可以选择拒绝这个用户访问Web服务器。当然,在一个繁忙的Web站点,这可能需要一个全职的员工。然而,在内部网,这真的是一个非常有用的工具。你可以对所有局域网内部用户提供资源,也可以对特定的用户提供。

13.使用NTFS安全

你的NTFS驱动器使用的是EVERYONE/完全控制权限,除非你手工关掉它们。关键是不要把自己锁定在外,不同的人需要不同的权限,管理员需要完全控制,后台管理账户也需要完全控制,系统和服务各自需要一种级别的访问权限,取决于不同的文件。最重要的文件夹是System 32,这个文件夹的访问权限越小越好。在Web服务器上使用NTFS权限能帮助你保护重要的文件和应用程序。

14.管理用户账户

如果你已经安装IIS,你可能产生了一个TSInternetUser账户。除非你真正需要这个账户,否则你应该禁用它。这个用户很容易被渗透,是黑客们的显著目标。为了帮助管理用户账户,确定你的本地安全策略没有问题,IUSR用户的权限也应该尽可能小。

15.审计你的Web服务器

审计对你的计算机的性能有着较大的影响,因此如果你不经常察看的话,还是不要做审计了。如果你真的能用到它,请审计系统事件并在你需要的时候加入审计工具。如果你正在使用前面提到的WhosOn工具,审计就不那么重要了。默认下,IIS总是记录访问,WhosOn会将这些记录放置在一个非常易读的数据库中,你可以通过Access或是Excel打开它。如果你经常查看异常数据库,你能在任何时候找到服务器的脆弱点。

3.4.3 应用于Apache的防范技术

Apache HTTP Server(以下简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,是最流行的Web服务器软件之一。虽然近年来Nginx和Lighttpd等Web Server的市场份额增长得很快,但Apache仍然是这个领域中独一无二的巨头,互联网上大多数的Web应用依然运行在Apache上。

Apache作为Web应用的载体,一旦出现安全问题,那么运行在其上的Web应用的安全也无法得到保障,所以研究Apache的漏洞与安全性就非常有意义了。

1.Apache漏洞分析

(1)远程拒绝服务漏洞。

漏洞描述:Apache在处理Range选项生成回应时存在漏洞,远程攻击者可能利用此漏洞通过发送恶意请求导致服务器失去响应,从而导致拒绝服务。

此漏洞源于Apache在处理Range头选项中包含的大量重叠范围指定命令时存在的问题,攻击者可通过发送到服务器的特制HTTP请求耗尽系统资源,导致Apache失去响应,甚至造成操作系统资源耗尽。

漏洞利用原理:HTTP请求中的Range选项定义了资源文件的分片请求方式,一般常用于网络的断点续传功能。攻击者通过在HTTP请求的Range选项中设置大量重叠的范围指定命令,Apache在处理这样的请求时需要消耗大量的CPU和内存资源,导致Apache失去响应,甚至造成操作系统资源耗尽。这样攻击者可以利用较小的代价实现对目标服务器的拒绝服务攻击,利用简单,且影响范围巨大。

(2)Apache文件解析漏洞。

Apache对于文件名的解析是从后往前解析的,直到遇见一个它认识的文件类型为止。因此,如果Web目录下存在以类似webshell.php.test这样格式命名的文件,Apache在解析时因为不认识.test这个文件类型,所以会一直往前解析,当解析到.php时,它认识了,因此会将它解析为PHP文件。

Apache的这种解析特性经常被用来绕过Web应用的文件上传检测。当Web应用的文件上传功能在检测上传文件的合法性时,如果仅通过检测上传文件的扩展名来判断文件是否合法,就可以利用Apache的这种文件名解析特征绕过Web应用的检测。

2.对Apache进行安全加固

Apache的安全加固我们主要从以下两点考虑:一是Apache Web Server本身是否安全,如是否存在安全漏洞;二是Apache Web Server是否提供了可使用的安全功能,这部分主要是检查Apache的配置是否得当,在安全性、可用性、稳定性之间取得平衡。

(1)Apache版本的选择与安装注意事项。

检查目前使用的Apache版本是否存在安全漏洞,如果存在,需要升级到新的安全版本。在选择Apache的版本时,我们一般选择最新的稳定版本。这样可以在安全性和稳定性之间取得一个很好的平衡。如果从低版本升级到高版本时,建议先在测试环境中测试通过后再进行升级,以避免由于兼容性带来的问题。在安装时使用自定义的安装路径,并配置使用自定义的Web目录。

(2)只加载必要的Module(模块)。

Apache有很多官方与非官方的Module,很多漏洞都是由于Apache的Module造成的。所以我们需要检查Apache的Module安装情况,根据“最小权限原则”,应该尽可能地减少不必要的Module,对于要使用的Module,则检查其对应版本是否存在已知的安全漏洞。可以在httpd.conf中配置需要加载或禁用的Module。

(3)Apache日志安全设置。

不论在哪种服务器上,日志都是一个非常重要的部分,我们需要对它严加保护。在Apache上也是如此,如图3-27所示。首先要修改日志的默认保存路径,然后设置只允许管理员有日志保存目录的完全控制权限。

图3-27 Apache错误日志

(4)网站目录权限配置。

原则:目录有写入权限,一定不要分配执行权限;目录有执行权限,一定不要分配写入权限。网站上传目录和数据库目录一般需要分配“写入”权限,但一定不要分配执行权限。其他目录一般只分配“读取”和“记录访问”权限即可。

(5)关闭Apache的目录浏览功能。

如果Apache采用默认配置,当Web目录下不存在默认索引页面(如index.html)时,会将当前目录下的所有文件和目录都列出来,这是十分危险的。

可以通过以下两种方法来关闭目录浏览功能:①打开httpd.conf配置文件,查找“Options Indexes FollowSymLinks”,修改为“Options -Indexes”,然后保存并重启Apache服务生效;②修改.htaccess文件——在.htaccess文件里加入“Options -Indexes”(没有双引号)就可以阻止目录列表的显示了。这样以后再访问不存在默认索引页面的目录时,Apache将会返回403错误页面。

1 单击WampServer程序图标;在“Powered by Alter Way”选项栏中,单击“Apache”按钮;再双击“httpd.conf”配置文件按钮,如图3-28所示。

图3-28 打开httpd.conf配置文件

2 在“查找内容”文本框中输入“Options Indexes FollowSymLinks”,单击“查找下一个”按钮,找到httpd.conf配置文件中“Options Indexes FollowSymLinks”一行,将“Options Indexes FollowSymLinks”修改为“Options -Indexes”,保存文件即可,如图3-29所示。

图3-29 修改httpd.conf配置文件

(6)修改Apache默认banner信息。

Apache的banner会泄露服务器的操作系统和Apache版本等相关信息,而这些信息对攻击者是非常有用的,我们需要修改默认配置来阻止这些信息的泄露。

3.4.4 应用于PHP的防范技术

PHP(Hypertext Preprocessor,超文本预处理器)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入HTML文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。

目前,基于PHP的网站开发已经成为网站开发的主流,PHP网站攻击与安全防范方面越来越引起人们的重视。

1.常见PHP网站安全漏洞有哪些

对于PHP,目前常见的漏洞有5种,分别是Session文件漏洞、SQL注入漏洞、脚本命令执行漏洞、全局变量漏洞和文件漏洞。下面分别对这些漏洞进行简要的介绍。

(1)Session文件漏洞。

Session攻击是黑客最常用到的攻击手段之一。当一个用户访问某一个网站时,为了避免客户每进入一个页面都要输入账号和密码,PHP设置了Session和Cookies用于方便用户的使用和访问。

(2)SQL注入漏洞。

在进行网站开发时,程序员由于对用户输入数据缺乏全面判断或者过滤不严导致服务器执行一些恶意信息,如用户信息查询等,黑客可以根据恶意程序返回的结果获取相应的信息。这就是所谓的SQL注入漏洞。

(3)脚本执行漏洞。

脚本执行漏洞是由于程序员在开发网站时对用户提交的URL参数过滤较少引起的,用户提交的URL可能包含恶意代码导致跨站脚本攻击。脚本执行漏洞在以前的PHP网站中经常存在,但是随着PHP版本的升级,这些问题已经减少或者不存在了。

(4)全局变量漏洞。

PHP中的变量在使用时不像其他开发语言那样需要事先声明,PHP中的变量可以不经声明就直接使用,使用时系统自动创建,而且也不需要对变量类型进行说明,系统会自动根据上下文环境确定变量类型。这种方式可以大大减少程序员编程中出错的概率,使用起来非常方便。

(5)文件漏洞。

文件漏洞通常是由于网站开发者在进行网站设计时对外部提供的数据缺乏充分的过滤导致黑客利用其中的漏洞在Web进程上执行相应的命令。假如在lsm.php中包含这样一段代码:include($b."/aaa.php".),这对黑客来说,可以通过变量$b来实现远程攻击,可以是黑客自己的代码,用来实现对网站的攻击;也可以向服务器提交a.php include=http://l27.0.0.1/b.php,然后执行b.php的指令。

2.PHP常见漏洞的防范措施与技术

(1)对于Session漏洞的防范。

从前面的分析可以知道,Session攻击最常见的就是会话劫持,也就是黑客通过各种攻击手段获取用户的Session ID,然后利用被攻击用户的身份来登录相应网站。为此,这里可以用以下几种方法进行防范:一是定期更换Session ID,更换Session ID可以用PHP自带函数来实现;二是更换Session名称,通常情况下Session的默认名称是PHPSESSID,这个变量一般是在Cookies中保存的,如果更改了它的名称,就可以阻挡黑客的部分攻击;三是对透明化的Session ID进行关闭处理,所谓透明化是指在HTTP请求没有使用Cookies来制定Session ID时,Sessioin ID使用链接来传递。关闭透明化Session ID可以通过操作php.ini文件来实现;四是通过URL传递隐藏参数,这样可以确保即使黑客获取了Session数据,但是由于相关参数是隐藏的,它也很难获得Session ID变量值。

(2)对SQL注入漏洞的防范。

黑客进行SQL注入手段很多,而且灵活多变,但是SQL注入的共同点就是利用输入过滤漏洞。因此,要想从根本上防止SQL注入,解决措施就是加强对请求命令尤其是查询请求命令的过滤。具体来说,包括以下几点:一是把过滤性语句进行参数化处理,也就是通过参数化语句实现用户信息的输入而不是直接把用户输入嵌入到语句中;二是在网站开发时尽可能少用解释性程序,黑客经常通过这种手段来执行非法命令;三是在网站开发时尽可能避免网站出现bug,否则黑客可能利用这些信息来攻击网站。仅仅通过防御SQL注入还是不够的,另外还要经常使用专业的漏洞扫描工具对网站进行漏洞扫描,如图3-30所示。

图3-30 专业PHP漏洞扫描器PhpScanning(基于C#开发的免费开源软件)

(3)对脚本执行漏洞的防范。

黑客利用脚本执行漏洞进行攻击的手段是多种多样的,而且是灵活多变的,对此,必须采用多种防范方法综合的手段,才能有效防止黑客对脚本执行漏洞进行攻击。这里常用的方法有以下四种;一是对可执行文件的路径进行预先设定,可以通过safe_moade_exec_dir来实现;二是对命令参数进行处理,一般用escapeshellarg函数实现;三是用系统自带的函数库来代替外部命令;四是在操作时尽可能减少使用外部命令。

(4)对全局变量漏洞防范。

对于PHP全局变量的漏洞问题,以前的PHP版本存在这样的问题,但是随着PHP版本升级到5.5以后,可以通过对php.ini的设置来实现,设置ruquest_order为GPC。另外在php. ini配置文件中,可以通过对magic_quotes_runtime进行布尔值设置是否对外部引入的数据中的溢出字符加反斜线。为了确保网站程序在服务器的任何设置状态下都能运行,可以在整个程序开始时用get_magic_quotes_runtime检测设置状态,决定是否要手工处理,或者在开始(或不需要自动转义)时用set_magic_quotes_runtime(0)关掉。

(5)对文件漏洞的防范。

对于PHP文件漏洞可以通过对服务器进行设置和配置来达到防范目的。这里具体的操作如下:一是把PHP代码中的错误提示关闭,这样可以避免黑客通过错误提示获取数据库信息和网页文件物理路径;二是对open_basedir进行设置,也就是对目录外的文件操作进行禁止处理,这样可以对本地文件或者远程文件起到保护作用,防止它们被攻击,这里还要注意防范Session文件和上载文件的攻击;三是把safe-made设置为开启状态,从而对将要执行的命令进行规范,通过禁止文件上传,可以有效地提高PHP网站的安全系数。

3.PHP的常见安全选项

下面的配置选项与安全相关,可以在php.ini文件中设置,如图3-31所示。使用这些设置确保你运行的PHP配置默认情况下的安全。

图3-31 php.ini配置文件

(1)open_basedir。

这个设置限制任何文件访问指向一个特定的目录,之后的所有文件操作被限制在所指定的位置。执行的任何文件操作应该在一个特定的目录集之内,这样一来,标准的“../../../../etc/passwd”变得非常安全。

(2)disable_functions。

这个设置可以在PHP中禁用一组函数。禁用函数被看作是纵深防御的一个很好的方式。如果应用不使用具有安全风险的函数如eval( )、 passthru( )、 system( ),那么应该始终不允许添加这些函数。

(3)expose_php。

将这个配置关闭将删除HTTP响应中Server首部中显示的PHP标志,作用于隐藏PHP版本或者PHP在应用中的运行。

(4)display_errors。

允许异常时向用户显示详细的错误信息。在生产环境中这个设置应该始终关闭。

(5)safe_mode。

在PHP中开启safe_mode允许非常严格的文件访问权限。为此要检查正在运行的PHP脚本所有者的权限,以及脚本试图进行的任何访问。如果权限不匹配,PHP抛出一个安全异常。safe_mode主要由ISP使用,这样在多宿主环境中,多个用户可以开发自己的PHP脚本而不会危及服务器的完整性。

(6)allow_url_fopen。

这个配置选项将会禁用远程文件的操作能力。这是阻止远程文件包含漏洞的很好的总体设置。

下面是一个示例,如果以下代码示例中的$absolute_path变量被设置为http://www.site. com/,设置allow_url_ fopen能使这一攻击失效。

include($absolute_path.'inc/adodb/adodb.inc.php');