CGI运行机制和基本环境变量备忘

IoT设备远程命令执行漏洞复现:从CGI注入到Root权限获取 在嵌入式系统与物联网(IoT)安全领域,命令注入是一种常见且危害巨大的漏洞类型。其核心原理在于应用程序未对用户输入进行充分验证和过滤,直接将用户可控数据拼接到系统命令中执行,导致攻击者能够注入并执行任意操作系统指令。这种漏洞的技术价值在于它往往能绕过常规的身份验证机制,直接获取设备的最高控制权,对智能路由、网络摄像头、NAS等设备的完整性、机密性和可用性构成直接威胁。典型的应用场景包括设备管理接口、网络诊断功能或配置更新服务,其中CGI(通用网关接口)脚本由于历史原因和开发便捷性,常成为此类漏洞的重灾区。本 阅读详情

前言

     读了三年的研究生,没有碰过web相关开发了。本科的三年的web开发经验都忘记完了。工作找好了,最近准备开始重新复习一下C和web相关的知识,以前做web开发的时候主要是主要是用PHP那几十个API来做系统开发,对PHP底层没有去学习过,最近打算从CGI出发,从本质上来了解一下web底层相关技术。

今天主要看了下面几个CGI入门的知识,还不错。

FastCGI实战:http://blog.youkuaiyun.com/huangyaoshifog/article/details/335433。

CGI入门:http://blog.youkuaiyun.com/conquerwave/article/details/7029864


CGI运行机制以及优缺点

CGI以可执行程序(例如exe)的形式,以独立进程运行在http服务器中。当http接受到请求,通过创建一个CGI进程,CGI通过标准输入输出IO同HTTP服务器之间进行交互,从而处理各种请求。处理完以后释放CGI进程。

CGI的优点:

  • CGI是以独立进程的方式来运行,所以如果一个CGI处理失败退出,不影响后面CGI处理,保证服务器的稳定性
  • CGI相对脚本来说,具有高安全性

CGI缺点:

  • CGI处理进程的创建开销较大,无法在高密度请求环境下使用。
  • 相对脚本来说,编辑HTML比较麻烦

下面主要列一下CGI的基本环境变量,作为以后查询用吧。

基本环境变量

         服务器与CGI程序交换信息的协作方式是通过环境变量实现的。无论什么请求,CGI程序总能在特定位置找到某些信息。无论环境变量怎样定义,总有一些变量有着特定含义。环境变量是一写保存用户信息的内存区。例如,所有的机器都有一个PATH环境变量,当在当前目录找布道文件时就要查找PATH变量。当服务器收到一个请求后,它首先要收集它能得到的所有相关信息,并把它放入内存。那么,服务器要收集什么信息呢?

  • 关于服务器自身的详细信息
  • 关于用户的信息信息
  • 关于用户请求的信息

        服务器不知道CGI程序到底需要那些信息,所以它把这些信息一起收集,那么如果有什么重要的东西就不会遗漏了。

环境变量的存储

在写C语言的时候完整的main函数的写法应该如下:

int main(int argc, char **argv, char **envp);

其中 argc表示参数个数,argv表示参数字符串,而这个envp就表示环境变量字符串。参数和环境变量都可以不止一个,所以,用指向字符串指针的指针来表示。
比如我们用C语言写了一个程序,运行在命令行下,带有2个参数

C:> cpfile.exe c:\test.txt d:\test.txt
argc=3;
argv[0] = "cpfile.exe";
argv[1] = "c:\test.txt";
argv[2] = "d:\test.txt";

在c语言中的stdlib.h中有一个extern char **environ; 或者extern char **_environ;的声明这个envp的参数实际上就是environ。

好,我们看看在cgi程序(其实就是一个C语言程序)里面怎么枚举这些环境变量

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_CONTENT_LEN        1024

int main()
{
    extern char   **environ;
    int nlen = 0;
    int i;
    char szContent[MAX_CONTENT_LEN];
    char **penv;
    char *req = NULL;

    memset(szContent, 0, MAX_CONTENT_LEN);
        
    printf("Content-type: text/html\n\n");
    
    for ( penv = environ; *penv; penv++ )
        printf("%s<br>", *penv);
    return 0;
}

输出结果如下:

SERVER_SOFTWARE=lighttpd/1.4.28
SERVER_NAME=127.0.0.1
GATEWAY_INTERFACE=CGI/1.1
SERVER_PROTOCOL=HTTP/1.1
SERVER_PORT=3000
SERVER_ADDR=0.0.0.0
REQUEST_METHOD=GET
REDIRECT_STATUS=200
REQUEST_URI=/cgi/testEnv.cgi
REMOTE_ADDR=127.0.0.1
REMOTE_PORT=52218
CONTENT_LENGTH=0
SCRIPT_FILENAME=/home/gss/workspace_c/web/cgi/testEnv.cgi
SCRIPT_NAME=/cgi/testEnv.cgi
DOCUMENT_ROOT=/home/gss/workspace_c/web/
HTTP_HOST=127.0.0.1:3000
HTTP_CONNECTION=keep-alive
HTTP_CACHE_CONTROL=max-age=0
HTTP_USER_AGENT=Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4
HTTP_ACCEPT=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
HTTP_ACCEPT_ENCODING=gzip,deflate,sdch
HTTP_ACCEPT_LANGUAGE=en-US,en;q=0.8
HTTP_ACCEPT_CHARSET=ISO-8859-1,utf-8;q=0.7,*;q=0.3

上面输出分别对应下面三种类型

与服务器自身相关的环境的变量

GATEWAY_INTERFACE服务器遵守的CGI版本
SERVER_NAME服务器的IP或名字
SERVER_PORT主机的端口号
SERVER_SOFTWARE服务器软件的名字

SERVER_NAME:127.0.0.1
SERVER_PORT:3000
GATEWAY_INTERFACE:CGI/1.1
SERVER_SOFTWARE:lighttpd/1.4.28

与客户端相关的环境的变量

服务器了解你的CGI程序,但它一定不知道你的客户机环境。正因为如此,同客户机有关的变量才是最重要的。因为它涉及到你的浏览器等等。

HTTP_ACCEPT例出能被次请求接受的应答方式
HTTP_ACCEPT_ENCODING列出客户机支持的编码方式
HTTP_ACCEPT_LANGUAGE表明客户机可接受语言的ISO代码
HTTP_USER_AGENT标明客户使用的软件

HTTP_ACCEPT:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
HTTP_ACCEPT_ENCODING:gzip,deflate,sdch
HTTP_ACCEPT_LANGUAGE:en-US,en;q=0.8
HTTP_USER_AGENT:Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4

与请求相关的环境的变量

       每次服务器受到的请求都不可能是一样的。这意味着有许多CGI程序必须注意的信息。这些与请求相关的信息包含有用户调用的信息,用户如何发送请求,以及作为请求的一部分传送了多少(什么)信息。这些对你的程序来说是非常重要的,因此我们将化些时间详细地讨论一下其中的一些变量。特别是下面写出的三个变量。这三个变量相当重要。

  • REQUEST_METHOD
  • QUERY_STRING
  • CONTENT_LENGTH
     你必须熟悉这三个变量,因为它们用来表示数据是如何送到CGI程序的;然后你所要要做的事情就是在这三个变量里取出数据,进行下一步的编程。其他的一些变量的用处很多,你可以了解你的竞争对手正在调用你的程序,你可以辨别用户是否注册,或者你可以设置连接到你的CGI程序以便要求附加路径信息包含在请求之中----因此你不必猜测你的用户正在你的服务器的哪个页面上。
CONTENT_LENGTHPOST请求中向标准输入(STDIN)发送的字节数
QUERY_STRING传送给CGI程序的URL的问号(?)之后的那一部分
REMOTE_ADDR最终用户的IP或主机名
REMOTE_USER如果用户合法,则是用户的组名
REQUEST_METHOD作为HTTP的一部分请求而传送数据的方法,比如get。
SCRPT_NAME运行的脚本名字
REQUEST_METHOD=GET
REDIRECT_STATUS=200
REQUEST_URI=/cgi/testEnv.cgi
REMOTE_ADDR=127.0.0.1
REMOTE_PORT=52218
CONTENT_LENGTH=0
SCRIPT_FILENAME=/home/gss/workspace_c/web/cgi/testEnv.cgi
SCRIPT_NAME=/cgi/testEnv.cgi

上面的参数都可以通过getenv函数进行获取

data = getenv("QUERY_STRING"); 



uhttpd安全机制深度解析:从源码到物联网设备漏洞实战 Web服务器是网络应用的基础组件,负责处理HTTP请求与响应。其核心原理在于通过套接字监听、请求解析、资源映射与响应生成,实现客户端与服务器间的数据交互。在嵌入式与物联网领域,资源受限的环境对Web服务器的轻量化、低功耗与高集成度提出了严苛要求,这直接关系到海量边缘设备的稳定运行与整体生态安全。uhttpd作为OpenWrt生态中广泛采用的轻量级服务器,其内置的路径遍历防护、缓冲区溢出防御及权限隔离机制,构成了设备本地管理界面与API服务的关键安全基石。通过剖析其安全设计哲学与常见漏洞场景(如CGI命令注入 阅读详情

相关推荐

Android车载桌面开发实战:从CarLauncher源码解析到自定义Launcher开发(Android 11)

本文深入解析了Android 11中CarLauncher的源码架构与核心模块,并提供了从零开始定制开发车载Launcher的完整实战指南。内容涵盖车载桌面的独特定位、驾驶场景优化、多屏协同、动态内容嵌入等核心挑战,以及如何构建符合安全规范、体验流畅的自定义车载桌面应用,是车载应用开发者提升系统级定制能力的实用参考。

weixin_29266647的博客 515

【网络】详解HTTP协议的CGI机制和CGI进程

CGI机制是HTTP协议提供的偏底层的一套机制,也是非常重要的机制——它让大量的业务进程和HTPP协议解耦。而CGI进程是业务层的,用来处理各种数据,比如把用户提交上来的数据插入数据库,再比如做某种运算。CGI机制和CGI进程在概念上是完全不一样的,他们的关系就行老婆和老婆饼一样。客户端通过HTTP协议向服务器提交数据的方式主要有两种:1.GET方法请求,GET方法没有请求正文,一般用来拉取服务器的数据,但也可以通过URL的参数提交数据(URL中?分隔符后面的就是要提交的数据)

2301_79796701的博客 1027

GD32_ADC采样+DMA多通道扫描传输

所使用的MCU 片上集成了 12 位逐次逼近式模数转换器模块(ADC),可以采样来自于 16 个外部通道和 2 个内部通道上的模拟信号。这 18 个 ADC 采样通道都支持多种运行模式,采样转换后,转换结果可以按照最低有效位对齐或最高有效位对齐的方式保存在相应的数据寄存器中。我们主要介绍其多通道扫描转换和DMA传输功能,在多个通道轮询采集ad数据,并使用DMA分别保存各个数据值,其能大大提高ADC的工作效率。以下为ADC 模块框图:

Yin_w的博客 8159

CGI的局限性

cgi的最大局限是它的“无状态性”。一个http服务器是不会记住两个请求组成——这些请求要么全是到同一服务器的,要么是到一些不同的服务器。每种情况下,服务器完成请求后,就挂起并忘记曾顺便访问过的用户。 能够记住一个呼叫者上次接通时做了什么的能力叫做“记住用户的状态”。http以及cgi都没有自动保留状态信息,在web事务中与状态信息最相近的东西是用户的浏览器高速缓冲区和cgi程序的智能。例如,如果

salutlu的专栏 1110

2023年第二十届五一数学建模竞赛C题:“双碳”目标下低碳建筑研究-思路详解与代码答案

2023年第二十届五一数学建模竞赛C题:“双碳”目标下低碳建筑研究-思路详解与代码答案

lichensun的博客 1万+

表面声波滤波器——叉指换能器设计实战:从关键参数到结构选型

本文深入探讨了表面声波滤波器核心部件叉指换能器的实战设计流程。从目标驱动出发,详细解析了如何根据中心频率确定关键参数指宽,并权衡叉指对数对带宽和插入损耗的影响。文章进一步介绍了通过变迹加权优化频率响应,并对比了梯形结构与纵向耦合谐振滤波器等主流结构选型的适用场景与优缺点,为工程师提供从理论计算到仿真验证的完整设计指南。

weixin_29216353的博客 103

【项目实战】自主实现 HTTP 项目(六)——CGI机制

我们在之前的篇目中讲到了,在我们客户端向服务器发送请求的时候,如果发送的内容是一个目录或者一个普通文件,我们给他们返回的是一个静态的网页。而接下来我们就讲解另一种情况,如果请求资源路径下面是一个可执行文件,那么这个时候就要我们使用(CGI)机制。

2021级大一程序白一枚,记录学习的每一步的脚印 2189

MoveIt避障规划实战:从点云到OctoMap的环境感知全流程

本文详细解析了MoveIt避障规划中从点云到OctoMap的环境感知全流程,重点介绍了深度相机选型、点云数据处理、OctoMap生成及避障规划参数调优等关键技术。通过实战案例展示了如何利用MoveIt和OctoMap实现机械臂在复杂环境中的高效避障,为工业自动化和服务机器人开发提供实用解决方案。

weixin_30417487的博客 569

初识 CGI,CGI 简识

什么是 CGI?CGI是Common Gateway Interface,即 公共网关接口 的简称。公共网关接口(CGI),是一套标准,定义了信息是如何在 Web 服务器和客户端脚本之间进行交换的。公共网关接口(CGI),是一种用于外部网关程序与信息服务器(如 HTTP 服务器)对接的接口标准。公共网关接口(CGI),它是一个用于定Web服务器与外部程序之间通信方式的标准,使得外部程序能生成HTML

xlxxcc的专栏 1万+

【水文学法总结】河道内生态流量计算方法(含MATLAB实现代码)

简介水文学法实现河道内生态流量计算

WW、forever的博客 5015

11、基于拓扑质心和树编辑距离的RNA二级结构比较方法

本文介绍了一种基于拓扑质心和树编辑距离的RNA二级结构比较方法,特别适用于处理具有假结结构的RNA。通过PEELING算法识别拓扑质心并将其转换为树结构,结合树编辑距离进行高效比较,并提供工具planeGraph2tree实现该方法。博文详细描述了方法原理、操作流程以及应用示例,展示了其在功能性非编码RNA分析中的实用性。

resnet7explorer的博客 111

CGI、FastCGI、WSGI、uwsgi、uWSGI

CGI、FastCGI、WSGI、uwsgi、uWSGI 1. CGI 1.1 CGI简介 1.2 Web服务器与CGI程序的交互 1.3 CGI工作原理 2. FastCGI 2.1 FastCGI简介 2.2 FastCGI工作原理 3. WSGI 4. uwsgi 5. uWSGI 6. 区分WSGI / uwsgi / uWSGI 7. 这些名词的关系 8. 有uWGSI了Dj...

wylu 1265

电容放电测试解析

电子设备断电后滤波电容残留电荷存在触电风险,需符合IEC等安全标准对放电时间的要求。放电测试需测量电容电压下降至安全值的时间,设计可采用主动放电电路或被动放电电阻。常见问题包括电阻选择不当或电路设计缺陷,建议预留放电时间裕度并采用组合放电方案。合规的放电设计是确保产品安全性和可靠性的关键环节。

硬核科技 800

项目——备忘录

学习进程创建, 等待, 终止. 使用代码实现. 编写自主shell. 封装fork/wait等操作, 编写函数 process_create(pid_t* pid, void* func, void* arg), func回调函数就是子进程执行的入口函数, arg是传递给func回调函数的参数. 调研popen/system, 理解这两个函数和fork的区别. 写一篇博客, 总结上述内...

浮生若白的博客 1670

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

在IPCam上搭建WEB服务并通过CGI交互的相关问题

本文涉及到目前遇到的几个方面的问题,也是分享,也做个记号备忘。 1,thttpd服务器搭建    1)下载:  http://www.acme.com/software/thttpd/    2)  交叉编译         命令:CC=arm-linux-gcc ./configure --host=arm-linux   这里有几个问题需要注意,比较令人郁闷的事情   1,co

翔子的世界 2772

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

FastCGI+lighttpd开发之介绍和环境搭建

由于需要做一些简单的基于FastCGI的Web开发,开始学习和调研,本篇介绍CGI和FastCGI的概念以及基于FastCGI官方的devkit,以及lighttpd搭建起简单的开发环境,以作备忘。 为啥要搞这个? 现在开发Web有N种选择,啥php,C#,java,ruby,nodejs…哪个都比开发FastCGI要简单和强大的多,为何还要跑到这么个底层来做Web服务呢?答案是嵌入式

fivedoumi的专栏 5064

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

总结与备忘:nginx与php-fpm与php

nginx       不仅仅可作HTTP服务器使用,更可用于做HTTP(第七层)上的负载均衡或代理,也可以做UDP/TCP(第四层)上的负载均衡或代理(V1.9.0开始),也可以做邮箱服务器 php-fpm       实现了CGI标准接口并实现了FastCGI进程的管理 php       相当于以前的CGI子程序,具体的服务逻辑脚本 访问php页面大致工作流程:

RdaOniCelK的专栏 657

AWStats安装备忘_win_apache_日志分析统计工具

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34259559的博客 170

spawn-fcgi 代码介绍

spawn-fcgi是一个小程序,作用是管理fast-cgi进程,功能和php-fpm类似,简单小巧,原先是属于lighttpd的一部分,后来由于使用比较广泛,所以就迁移出来作为独立项目了,本文介绍的是这个版本“spawn-fcgi-1.6.3”。不过从发布新版本到目前已经4年了,代码一直没有变动,需求少,基本满足了。另外php有php-fpm后,码农们再也不担心跑不起FCGI了。 很久之前

tycoon的专栏 1621

php getenv()函数

注:有时候,$_ENV会为空,其原因通常是php的配置文件php.ini的配置项为:variables_order = "GPCS"。要想让$_ENV的值不为空,那么variables_order的值应该加上一个大写字母“E”,即:variables_order = "EGPCS"。 所以,官方建议用getenv函数.于是,转载了这篇文章,备忘。。。 转载自这里:http://blog

leejianjun的博客 1017

Windows server 2019 IIS部署Python Web应用完整指南

以管理员身份运行PowerShell:# 创建目标目录# 下载并安装# 设置环境变量。

weixin_42151596的博客 2536

【完整手记】Ubuntu+PHP5.6+cli+php-fpm下如何读取和配置$_ENV

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33781606的博客 589

2019,感谢一路深情

...

Shum Laboratory 258

window+nginx+php

今天在Windows上配置了下nginx,看了不少其他大牛们记录的博客,自己也操作了一番,记录一下备忘。 nginx download: http://nginx.org/en/download.htmlphp download: http://php.net/windows下nginx+php的安装配置如下:1、安装php(D:/php)2、配置php.ini extension...

weixin_30332705的博客 94

告别iTerm2 Trigger:SSH密钥对实现安全高效的免密登录

在远程服务器管理和自动化运维中,安全高效的身份认证是核心需求。传统的密码认证存在被嗅探和暴力破解的风险,而基于非对称加密原理的SSH密钥对方案,通过公钥与私钥的配合,从根本上解决了这一问题。私钥始终保存在本地且可加密保护,公钥则部署于服务器,认证过程无需传输密钥,极大提升了安全性。该技术不仅是手工登录的最佳实践,更是Git操作、CI/CD流水线及各类自动化脚本与服务器安全通信的基石。对于需要频繁登录多台服务器的开发、运维及SRE工程师而言,掌握SSH密钥对的配置与管理,能有效替代iTerm2 Trigger

weixin_34116110的博客 369
上一篇: 通过看linux环境相关源码学习编程(持续更新)
下一篇: Lighttpd 轻量级服务端
ColZer
博客等级 码龄14年 42粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值