CGI 补充内容
CGI的运行原理
当用户在网页上发出一个请求,比如点击一个链接或提交一个表单,请求的URL会指向一个服务器上的CGI脚本。服务器会根据URL中的参数和请求方法,将一些信息传递给CGI脚本,比如查询字符串、内容长度、请求方法等,这些信息通常通过环境变量或命令行参数传递。服务器还会将请求的主体部分,比如表单数据,通过标准输入流传递给CGI脚本。CGI脚本会根据接收到的信息进行相应的处理,比如查询数据库、生成动态内容等,并将处理结果通过标准输出流返回给服务器。返回的结果必须包含一个合法的HTTP头部,指明内容类型、状态码等信息,然后是一个空行,再然后是实际的内容,比如HTML页面、图片数据等。服务器会将CGI脚本的输出作为响应发送给用户。
运用CGI的例子
一个简单的计数器脚本,它可以显示网页被访问的次数。这个脚本可以用C语言或Perl语言编写,并放在服务器的cgi-bin目录下。当用户请求这个脚本的URL时,服务器会执行这个脚本,并将其输出返回给用户。输出是一个包含计数器值的HTML页面,每次访问都会增加一。这个脚本需要一个文本文件来存储计数器值,并在每次执行时读取和更新这个文件。
CGI可能存在的安全漏洞
产生原因:由于用户输入没有被正确地解析或过滤,导致攻击者可以通过网页URL传递一些参数或命令,从而执行一些恶意的操作。列举如下:
- 利用CGI脚本的权限,访问或修改服务器上的敏感文件或数据
- 利用CGI脚本的内存问题,注入或执行一些恶意的代码
- 利用CGI脚本的输入验证问题,传递一些非法或危险的数据,造成服务器的崩溃或拒绝服务。 为了避免这些漏洞,你在使用CGI的时候应该注意以下几点:
- 限制CGI脚本的权限,不要让它们以root用户或其他高权限用户运行。
- 管理好CGI脚本的内存分配和释放,避免内存泄露或溢出。
- 对用户输入进行严格的验证和过滤,防止SQL注入、跨站脚本、命令执行等攻击。
CGI的优缺点
CGI的优点有:
- CGI是一个非常明确和支持良好的标准,可以用任何语言和平台编写CGI程序,只要符合规范。
- CGI可以实现网页和外部程序或数据库的交互,提供动态内容和功能。
- CGI有很多现成的代码和框架,可以方便地实现一些常见的任务,比如计数器、表单处理、访问控制等。
CGI的缺点有:
- CGI每次处理请求时都需要启动一个新的进程,占用服务器的内存和资源,效率低下。
- CGI不能很好地在内存中缓存数据,每次都需要打开或关闭数据库连接,速度慢。
- CGI需要对用户输入进行严格的验证和过滤,否则可能会遭受SQL注入、跨站脚本、命令执行等攻击。
CGI的横向对比
实现服务端和客户端交互的其他方式
- Servlet:一种基于Java的技术,可以在服务器上运行Java程序,比CGI更快、更稳定、更安全。
- ASP:一种基于Microsoft的技术,可以在服务器上运行VBScript或JScript程序,提供了丰富的组件和功能。
- PHP:一种基于开源的技术,可以在服务器上运行PHP程序,支持多种数据库和平台,易于学习和使用。
CGI和其他技术的区别
- CGI是一种协议,而不是一种语言,它可以用任何语言和平台实现,只要符合规范。其他技术,比如Servlet、ASP、PHP等,都是基于特定的语言或平台的技术,有自己的语法和特性。
- CGI每次处理请求时都需要启动一个新的进程,占用服务器的内存和资源,效率低下。其他技术,比如Servlet、ASP、PHP等,都是在服务器上运行一个持久的程序,可以在内存中缓存数据和连接,速度快。
- CGI需要对用户输入进行严格的验证和过滤,否则可能会遭受SQL注入、跨站脚本、命令执行等攻击。其他技术,比如Servlet、ASP、PHP等,都提供了一些内置的函数或组件,可以方便地处理用户输入和输出,提高安全性。
- CGI有很多现成的代码和框架,可以方便地实现一些常见的任务,比如计数器、表单处理、访问控制等。其他技术,比如Servlet、ASP、PHP等,也有很多成熟的库和框架,可以提供更多的功能和扩展性。
CGI在现在的网页开发中还有一定的用处,但已经不是主流的技术了。
CGI的用处主要有以下几点:
- CGI可以实现一些简单的动态内容和功能,比如计数器、表单处理、访问控制等,不需要安装或配置复杂的服务器或框架。
- CGI可以用任何语言和平台实现,只要符合规范,可以充分利用现有的代码和资源,也可以学习一些新的语言或技术。
- CGI可以作为一种学习和实验的工具,了解网页和服务器之间的交互原理和过程,以及一些安全和性能的问题和解决方法。
CGI已经不是主流的技术的原因主要有以下几点:
- CGI每次处理请求时都需要启动一个新的进程,占用服务器的内存和资源,效率低下,不能满足高并发和高性能的需求。
- CGI不能很好地在内存中缓存数据和连接,每次都需要打开或关闭数据库连接,速度慢,也容易出现错误或冲突。
- CGI需要对用户输入进行严格的验证和过滤,否则可能会遭受SQL注入、跨站脚本、命令执行等攻击,这些攻击已经非常普遍和危险。
- CGI有很多现成的代码和框架,但也有很多过时或不兼容的代码和框架,需要花费时间和精力去选择和维护。
CGI的框架
- CGI::Framework:一个用Perl语言编写的轻量级的CGI框架,提供了一些基本的功能,如参数验证、会话管理、错误处理等。
- Web.py:一个用Python语言编写的简单而强大的CGI框架,提供了一些高级的功能,如模板系统、数据库访问、缓存机制等。
- Sinatra:一个用Ruby语言编写的极简主义的CGI框架,提供了一种优雅而灵活的方式来定义路由和处理请求。
CGI的实例
Web.py的例子,这是一个用Python语言编写的CGI框架。假设你想用这个框架来实现一个简单的留言板功能,你需要做以下几个步骤:
- 在你的服务器上创建一个cgi-bin目录,这是存放CGI脚本的地方。
- 在cgi-bin目录下创建一个guestbook.py文件,这是你的主要的CGI脚本,它的内容如下:
1 | #!/usr/bin/env python |
- 在cgi-bin目录下创建一个templates文件夹,这是用来存放HTML模板的文件夹。
- 在templates文件夹下创建一个base.html文件,这是用来定义HTML页面的基本结构的文件,它的内容如下:
1 | $def with (title) |
- 在templates文件夹下创建一个add.html文件,这是用来显示添加留言成功的文件,它的内容如下:
1 | $def with () |
- 在cgi-bin目录下创建一个data文件夹,这是用来存放留言数据的文件夹。
- 在data文件夹下创建一个guestbook.txt文件,这是用来存放留言数据的文本文件,它的内容可以为空或者有一些示例数据,每一行代表一条留言,格式为:姓名|留言内容|时间戳。例如:
1 | Alice|Hello world!|1639566000 |
- 为了让你的CGI脚本可以被服务器执行,你需要给它赋予可执行权限,比如在Linux系统下,你可以使用chmod命令:
1 | chmod +x guestbook.py |
- 现在你可以在浏览器中访问你的CGI脚本的URL,比如http://localhost/cgi-bin/guestbook.py,你就可以看到你的留言板页面了。你也可以添加新的留言,或者刷新页面看到其他人的留言。
各种语言对CGI的实现
主要是遵循CGI的协议和标准,通过和服务器交换一些特定的环境变量和数据,来实现动态内容的生成和返回。比如说:
- Java:可以使用Java Servlet技术来实现CGI,Servlet是一种运行在服务器上的Java程序,可以接收和处理客户端的请求,生成动态的HTML页面或其他类型的文档。Servlet可以使用Java的标准库或第三方的库来访问数据库或其他服务器。Servlet也可以使用JSP(Java Server Pages)技术来简化HTML页面的生成。
- Python:可以使用Python的标准库中的cgi模块来实现CGI,cgi模块提供了一些类和函数来处理客户端的请求,获取表单数据,输出HTTP头部和内容等。Python也有很多第三方的框架或库来简化CGI开发,比如Web.py、Flask、Django等。
- PHP:可以使用PHP的内置功能来实现CGI,PHP是一种专门用于网页开发的语言,它可以嵌入到HTML页面中,或者作为一个独立的脚本运行。PHP可以直接获取客户端的请求数据,输出HTTP头部和内容,以及访问数据库或其他服务器。PHP也有很多第三方的框架或库来简化CGI开发,比如Laravel、Symfony、CodeIgniter等。
CGI的漏洞
有一些关于CGI的CVE漏洞,比如:
- CVE-2021-41773:一个影响Apache HTTP Server 2.4.49版本的漏洞,利用路径规范化的变化,可以实现路径遍历攻击,将URL映射到Alias-like指令配置之外的文件。如果这些文件没有受到默认配置的保护,这些请求可以成功。如果这些路径也启用了CGI脚本,这可能导致远程代码执行。这个漏洞已经被在野利用。Apache HTTP Server 2.4.50版本的修复也不完整,参见CVE-2021-420131。
- CVE-2021-2021:一个影响Oracle MySQL Server 8.0.22及之前版本的漏洞,位于Server: Optimizer组件。高权限的攻击者可以通过多种协议的网络访问来攻击MySQL Server。成功的攻击可以导致MySQL Server挂起或频繁崩溃2。
- CVE-2021-22204:一个影响ExifTool的漏洞,位于DjVu模块。当解析一个恶意的图像时,可以实现任意代码执行。这个漏洞影响了ExifTool 7.44及之前版本3。
- CVE-2022-31126:一个影响Roxy-wi的漏洞,Roxy-wi是一个用于管理Haproxy, Nginx, Apache和Keepalived服务器的开源Web界面。攻击者可以通过向/app/options.py文件发送一个特制的HTTP请求来实现代码执行。这个漏洞影响了Roxy-wi 6.1.1.0之前的版本4。 如果你想了解更多关于CGI的CVE漏洞的信息,你可以访问以下英文网站:
- NVD - CVE-2021-41773 - NIST**1**:一个介绍CVE-2021-41773漏洞的网页,提供了漏洞描述、严重程度、修复信息、参考链接等信息。
- CVE - CVE-2021-2021 - Common Vulnerabilities and Exposures2:一个介绍CVE-2021-2021漏洞的网页,提供了漏洞描述、参考链接等信息。
- CVE - CVE-2021-22204 - Common Vulnerabilities and Exposures**3**:一个介绍CVE-2021-22204漏洞的网页,提供了漏洞描述、参考链接等信息。
- CVE - Search Results - Common Vulnerabilities and Exposures**4**:一个搜索CGI相关CVE漏洞的网页,提供了多个CVE漏洞的标题、摘要和链接。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 zishuQ's blog!