File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -43,7 +43,7 @@ Content-Length: 31
4343
4444php-cgi也是一个sapi。在远古的时候,web应用的运行方式很简单,web容器接收到http数据包后,拿到用户请求的文件(cgi脚本),并fork出一个子进程(解释器)去执行这个文件,然后拿到执行结果,直接返回给用户,同时这个解释器子进程也就结束了。基于bash、perl等语言的web应用多半都是以这种方式来执行,这种执行方式一般就被称为cgi,在安装Apache的时候默认有一个cgi-bin目录,最早就是放置这些cgi脚本用的。
4545
46- 但cgi模式有个致命的缺点,众所周知,进程的创建和调度都是有一定消耗的,而且进程的数量也不是无限的。所以,基于cgi模式运行的网站通常不能同时接受大量请求,否则每个请求生成一个子进程,就有可能把服务器挤爆。于是后来就有了fastcgi,解释器可以将自己一直运行在后台 ,并通过fastcgi协议接受数据包,执行后返回结果,但自身并不退出。
46+ 但cgi模式有个致命的缺点,众所周知,进程的创建和调度都是有一定消耗的,而且进程的数量也不是无限的。所以,基于cgi模式运行的网站通常不能同时接受大量请求,否则每个请求生成一个子进程,就有可能把服务器挤爆。于是后来就有了fastcgi,fastcgi进程可以将自己一直运行在后台 ,并通过fastcgi协议接受数据包,执行后返回结果,但自身并不退出。
4747
4848php有一个叫php-cgi的sapi,php-cgi有两个功能,一是提供cgi方式的交互,二是提供fastcgi方式的交互。也就说,我们可以像perl一样,让web容器直接fork一个php-cgi进程执行某脚本;也可以在后台运行` php-cgi -b 127.0.0.1:9000 ` (php-cgi作为fastcgi的管理器),并让web容器用fastcgi协议和9000交互。
4949
@@ -111,7 +111,7 @@ some point must have had a reason for disallowing this.
111111
112112这就是本漏洞的历史成因。
113113
114- ## 漏洞利用
114+ ### 漏洞利用
115115
116116那么,可控命令行参数,能做些什么事。
117117
@@ -135,7 +135,7 @@ some point must have had a reason for disallowing this.
135135
136136注意,空格用` + ` 或` %20 ` 代替,` = ` 用url编码代替。
137137
138- ## CVE-2012 -2311
138+ ### CVE-2012 -2311
139139
140140这个漏洞被爆出来以后,PHP官方对其进行了修补,发布了新版本5.4.2及5.3.12,但这个修复是不完全的,可以被绕过,进而衍生出CVE-2012 -2311漏洞。
141141
@@ -152,14 +152,14 @@ if(query_string = getenv("QUERY_STRING")) {
152152}
153153```
154154
155- 可见,获取querystring后进行解码,如果第一个字符是` - ` 则设置skip_getopt,也就是获取命令行参数 。
155+ 可见,获取querystring后进行解码,如果第一个字符是` - ` 则设置skip_getopt,也就是不要获取命令行参数 。
156156
157157这个修复方法不安全的地方在于,如果运维对php-cgi进行了一层封装的情况下:
158158
159159```
160160#!/bin/sh
161161
162- exec /dh/cgi-system/php5. cgi $*
162+ exec /usr/local/bin/php- cgi $*
163163```
164164
165165通过使用空白符加` - ` 的方式,也能传入参数。这时候querystring的第一个字符就是空白符而不是` - ` 了,绕过了上述检查。
You can’t perform that action at this time.
0 commit comments