CGI安全概述 

范堡 发布于 2009/05/05 15:03
阅读 258
收藏 0

CGI安全概述  

在这里讨论一下与CGI相关的一些话题,当然主要是CGI的安全问题。 


1.什么是CGI? 

不要奇怪,有相当一部分人对CGI的概念还比较模糊,他们眼中的CGI就是Perl CGI,其实CGI是Common Gateway Interface(公用网关接口)的简称,并不特指一种语言。事实上,几乎任何支持标准输入输出的语言都可以称为CGI语言,如Perl,Php,C,VC++等都可以称为CGI语言。 



2.什么是CGI安全? 

这里所说的CGI安全,主要包括两个方面,一是Web服务器的安全,一是CGI语言的安全(其实对于解释型CGI语言,还涉及到解释器的安全,不过由于它在CGI安全中所占的比例不大,所以我们就不考虑了)。对于不同的CGI语言,我们所说的CGI安全可能有些不同,比如说对于ASP和JSP,我们所说的CGI安全主要是指Web服务器的安全。而对于Php和Perl,我们所说的CGI安全就主要是指CGI语言的安全。 



3.CGI存在什么安全问题? 

既然CGI安全包括两个方面,那我们就分别从这两个方面来介绍一下CGI的安全性,下面依次介绍Web服务器的安全和CGI语言的安全。 



Web服务器的安全问题主要包括两个方面,一是Web服务器软件编制中的BUG,二是服务器配置错误。这可能导致CGI源代码泄露,物理路径信息泄露,系统敏感信息泄露或远程执行任意指令。 



下面主要讨论一下CGI语言的安全问题。由于CGI语言的复杂性,所以这方面的安全问题也比较多,参考Securityfocus关于漏洞起因的分类,我们可以为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”函数,如果没有在错误信息后面加上“\n”的话,就极可能导致物理路径泄露。 



*         其它错误 

此外,还有一些其它难以归类的错误,如“非1即0”导致绕过认证的问题。 

    

4.如果让你的CGI更安全? 

了解了CGI的安全问题,我们也该知道怎么加强CGI的安全了吧?下面简单总结一下作为参考: 



*         使用最新版本的Web服务器,安装最新的补丁程序,正确配置服务器 

*         按照帮助文件正确安装CGI程序,删除不必要的安装文件和临时文件 

*         使用C编写CGI程序时,使用安全的函数 

*         使用安全有效的验证用户身份的方法 

*         验证用户的来源,防止用户短时间内过多动作 

*         推荐过滤“& ; ` ' \ " | * ? ~ < >; ^ ( ) [ ] { } $ \n \r \t \0 # ../” 

*         注意处理好意外情况 

*         实现功能时制定安全合理的策略 

*         培养良好的编程习惯 

*         科学严谨的治学态度,避免“想当然”的错误 







原文链接:http://bbs.chinaunix.net/viewthread.php?tid=16066

转载请注明作者名及原文出处



加载中
返回顶部
顶部