当前位置:Linux教程 - Php - 堵塞Web漏洞(上)

堵塞Web漏洞(上)

Web的大多数安全问题都属于下面三种类型之一 :
1. 服务器向公众提供了不应该提供的服务。

2. 服务器把本应私有的数据放到了公开访问的区域。

3. 服务器信赖了来自不可信赖数据源的数据。   

显然,许多服务器管理员从来没有从另一个角度来看看他们的服务器,例如使用端口扫描程序。如果他们曾经这样做了,就不会在自己的系统上运行那么多的服务,而这些服务原本无需在正式提供Web服务的机器上运行,或者这些服务原本无需面向公众开放。

与这种错误经常相伴的是,为了进行维护而运行某些不安全的、可用于窃取信息的协议。例如,有些Web服务器常常为了收集订单而提供POP3服务,或者为了上载新的页面内容而提供FTP服务甚至数据库服务。在某些地方这些协议可能提供安全认证(比如APOP)甚至安全传输(比如POP或者FTP的SSL版本),但更多的时候,人们使用的是这些协议的非安全版本。有些协议,比如Msql数据库服务,则几乎没有提供任何验证机制。

从公司外面访问自己的网络,完整地检测、模拟攻击自己的网站看看会发生些什么,这对于Web管理者来说是一个很好的建议。有些服务在机器安装之后的默认配置中已经启动,或者由于安装以及初始设置的需要而启动了某些服务,这些服务可能还没有正确地关闭。例如,有些系统提供的Web服务器会在非标准的端口上提供编程示范以及系统手册,它们往往包含错误的程序代码并成为安全隐患所在。正式运行的、可从Internet访问的Web服务器不应该运行这些服务,请务必关闭这些服务。   

9.1 Web服务器常见漏洞介绍

我们的目的就是向大家介绍Web服务器的常见漏洞,相信看了自己也能试着发现一些Web服务器的漏洞了。不过需要记住的是,不要为了寻找漏洞而寻找漏洞。另外,即使你找到了漏洞,是否能够利用还是另外一回事。

Web服务器存在的主要漏洞包括物理路径泄露,CGI源代码泄露,目录遍历,执行任意命令,缓冲区溢出,拒绝服务,条件竞争和跨站脚本执行漏洞,和CGI漏洞有些相似的地方,但是更多的地方还是有着本质的不同。不过无论是什么漏洞,都体现着安全是一个整体的真理,考虑Web服务器的安全性,必须要考虑到与之相配合的操作系统。

9.1.1 物理路径泄露

物理路径泄露一般是由于Web服务器处理用户请求出错导致的,如通过提交一个超长的请求,或者是某个精心构造的特殊请求,亦或是请求一个Web服务器上不存在的文件。这些请求都有一个共同特点,那就是被请求的文件肯定属于CGI脚本,而不是静态HTML页面。

还有一种情况,就是Web服务器的某些显示环境变量的程序错误的输出了Web服务器的物理路径,这应该算是设计上的问题。

9.1.2  目录遍历

目录遍历对于Web服务器来说并不多见,通过对任意目录附加“../”,或者是在有特殊意义的目录附加“../”,或者是附加“../”的一些变形,如“..\”或“..//”甚至其编码,都可能导致目录遍历。前一种情况并不多见,但是后面的几种情况就常见得多,去年非常流行的IIS二次解码漏洞和Unicode解码漏洞都可以看作是变形后的编码。

9.1.3 执行任意命令

执行任意命令即执行任意操作系统命令,主要包括两种情况。一是通过遍历目录,如前面提到的二次解码和UNICODE解码漏洞,来执行系统命令。另外一种就是Web服务器把用户提交的请求作为SSI指令解析,因此导致执行任意命令。

9.1.4 缓冲区溢出

缓冲区溢出漏洞想必大家都很熟悉,无非是Web服务器没有对用户提交的超长请求没有进行合适的处理,这种请求可能包括超长URL,超长HTTP Header域,或者是其它超长的数据。这种漏洞可能导致执行任意命令或者是拒绝服务,这一般取决于构造的数据。

9.1.5 拒绝服务

拒绝服务产生的原因多种多样,主要包括超长URL,特殊目录,超长HTTP Header域,畸形HTTP Header域或者是DOS设备文件等。由于Web服务器在处理这些特殊请求时不知所措或者是处理方式不当,因此出错终止或挂起。

9.1.6  条件竞争

这里的条件竞争主要针对一些管理服务器而言,这类服务器一般是以System或Root身份运行的。当它们需要使用一些临时文件,而在对这些文件进行写操作之前,却没有对文件的属性进行检查,一般可能导致重要系统文件被重写,甚至获得系统控制权。

9.2 CGI的安全性

现在我们来谈谈到底什么是CGI(Common Gate Intergace)。在物理上,CGI是一段程序,它运行在Server上,提供同客户段 Html页面的接口。这样说大概还不好理解。那么我们看一个实际例子: 现在的个人主页上大部分都有一个留言本。留 言本的工作是这样的:先由用户在客户段输入一些信息,如名字之类的东西。接着用户按一下“留言”(到目前为止工作都在客户端),浏览器把这些信息传送到服务器的CGI目录下特定的 CGI程序中,于是CGI程序在服务器上按照预定的方法进行处理。在本例中就是把用户提交的信息 存入指定的文件中。然后CGI程序给客户端发送一个信息,表示请求的任务已经结束。此时用户在 浏览器里将看到“留言结束”的字样。整个过程结束。

CGI是一种共用网关接口,它可以称之为一种机制.因此您可以使用不同的程序编写适合的CGI程序,这些程序语言包括Visual Basic、Delphi或C/C++等,您将已经写好的程序放在Web服务器的计算机上运行,再将其运行结果通过Web服务器传输到客户端的浏览器上。事实上,这样的编制方式比较困难而且效率低下,因为你每一次修改程序都必须重新将CGI程序编译成可执行文件。

9.2.1 为什么使用CGI

CGI可以为我们提供许多HTML无法做到的功能,比如:

1.一个记数器

2.顾客信息表格的提交以及统计

3.搜索程序

4.Web数据库

用HTML是没有办法记住客户的任何信息的,就算用户愿意让你知道。用HTML也是无法把信息记录到某一个特定文件里的。要把客户段的信息记录在服务器的硬盘上,就要用到CGI。这是CGI最重要的作用,它补充了HTML的不足。是的,仅仅是补充,不是替代。

9.2.2  CGI安全问题

在计算机领域——尤其在Internet上——尽管大部分Web服务器所编的程序都尽可能保护自己的内容不受侵害,但只要CGI脚本中有一点安全方面的失误——口令文件、私有数据、以及任何东西,就能使入侵者能访问计算机。遵循一些简单的规则并保持警惕能使自己的CGI脚本免受侵害,从而可以保护自己的权益。这里所说的CGI安全,主要包括两个方面,一是Web服务器的安全,一是CGI语言的安全

先从CGI问题的分类开始谈起,一般来说,CGI问题主要有以下几类:

1.暴露敏感或不敏感信息;

2.缺省提供的某些正常服务未关闭;

3.利用某些服务漏洞执行命令;

4.应用程序存在远程溢出;

5.非通用CGI程序的编程漏洞。


下面我们就来详细介绍一下关于CGI的漏洞:

●配置错误

这里所说的配置错误主要指CGI程序和数据文件的权限设置不当,这可能导致CGI源代码或敏感信息泄露。还有一个经常犯的错误就是安装完CGI程序后没有删除安装脚本,这样攻击者就可能远程重置数据。前些日子“XX大联盟”论坛多次被黑就是这个低级错误所致。

●边界条件错误

这个错误主要针对C语言编写的CGI,利用这个错误,攻击者可能发起缓冲区溢出攻击,从而提升权限。

●访问验证错误

这个问题主要是因为用于验证的条件不足以确定用户的身份而造成的,经常会导致未经授权访问,修改甚至删除没有访问权限的内容。用于确定用户身份的方法一般有两种,一是账号和密码,一是Session认证。而不安全的认证方法包括Userid认证,Cookie认证等等。

●来源验证错误

比较常见的利用这种错误进行攻击的方法就是DoS,也就是拒绝服务攻击,如我们知道的灌水机,就是利用CGI程序没有对文章的来源进行验证,从而不间断的发文章,最后导致服务器硬盘充满而挂起。

●输入验证错误

这种错误导致的安全问题最多,主要是因为没有过滤特殊字符。比如说,没有过滤“%20”造成的畸形注册,没有过滤“../”经常造成泄露系统文件,没有过滤“$”经常导致泄露网页中的敏感信息,没有过滤“;”经常导致执行任意系统指令,没有过滤“|”或“\t”经常导致文本文件攻击,没有过滤“’”和“#”经常导致SQL数据库攻击,没有过滤“<”和“>”导致的Cross-Site Scripting攻击等。

●意外情况处理失败

这种错误也很常见,如没有检查文件是否存在就直接打开设备文件导致拒绝服务,没有检查文件是否存在就打开文件提取内容进行比较而绕过验证,上下文攻击导致执行任意代码等。

●策略错误

这种错误主要是由于编制CGI程序的程序员的决策造成的。如原始密码生成机制脆弱导致穷举密码导致在Cookie中明文存放账号密码导致敏感信息泄露,使用与CGI程序不同的扩展名扩展名存储敏感信息导致该文件被直接下载,丢失密码模块在确认用户身份之后直接让用户修改密码而不是把密码发到用户的注册信箱,登陆时采用账号和加密后的密码进行认证导致攻击者不需要知道用户的原始密码就能够登陆等。

●习惯问题

程序员的习惯也可能导致安全问题,如使用某些文本编辑器修改CGI程序时,经常会生成“.bak”文件,如果程序员编辑完后没有删除这些备份文件,则可能导致CGI源代码泄露。另外,如果程序员总喜欢把一些敏感信息(如账号密码)放在CGI文件中的话,只要攻击者对该CGI文件有读权限(或者利用前面介绍的一些攻击方法)就可能导致敏感信息泄露。

●使用错误

主要是一些函数的使用错误,如Perl中的“die”函数,如果没有在错误信