
万维网协会创造了
CGI,它是一种能够动态地创建Web内容的协议。它在外部程序和Web浏览器之间建立了一条通信线路。CGI的规范会告诉Web服务器如何执行外部程序来满足浏览器请求。这个规范还定义了如何对双向传送的数据进行格式化。CGI不是一个应用程序接口(API),这就意味着你可以使用大多数通行的语言(C++、Java、Perl、PHP等等)来实现它。不幸的是,黑客们能够用多种方式来攻破CGI的应用程序。
CGI的表单和内容
一个典型的CGI应用程序会通过表单来实现Web应用程序同用户之间的交互操作。表单通常都是在HTML里生成的。一旦提交了表单,浏览器就会提取表单里的数据,将其格式化,然后将它发送到一个预先定义的URL上(在表单的发布属性里指定)。CGI程序会验证该数据并指明任何错误(会被发送回浏览器)。通过这种方式,CGI程序就能够被当作用户交互操作的数据库前端。
权限的滥用
由于CGI很容易就能够被用作前端,因此其灵活性和强大的性能很容易就被不当地使用。下面就是一些例子,告诉你CGI的这些特性是如何被用来攻破一个编写不当的CGI脚本的:
- 取得许可权。在通常情况下,一个CGI应用程序具有运行中的Web服务器里用户所具有的权限——而该用户可能会有根用户(root)的权限。你可能会奇怪为什么CGI脚本会具有同样的权限。其原因是为了避免CGI脚本(它会访问数据库)瓶颈,这一瓶颈会导致CGI脚本无法执行Web服务器所能够执行的操作。黑客们知道,获得了CGI脚本的控制权常常就意味着根用户权限的获得。
- 内存的问题。由于CGI脚本常常都不是很主要的东西,甚至是微不足道的,因此没有什么人愿意花精力去校正内存段分配的问题。如果黑客能够获得CGI脚本的控制权,那么他就能够访问到服务器的内存资源,而这些资源可能会被随意地用来执行恶意代码。
- 未经过验证的输入。输入内容筛选需要有多严格应该由程序员来决定。要记住,CGI脚本常常被用来将输入信息直接从用户送到Web服务器的内部。如果对输入内容进行验证的CGI脚本缺失或者编写不当,黑客就有可能操控脚本获取内存来执行未经授权的程序。