Skip to content

Commit 8806c5e

Browse files
committed
readme has some modify
1 parent 487ca61 commit 8806c5e

1 file changed

Lines changed: 5 additions & 5 deletions

File tree

php/CVE-2012-1823/README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ Content-Length: 31
4343

4444
php-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

4848
php有一个叫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的第一个字符就是空白符而不是`-`了,绕过了上述检查。

0 commit comments

Comments
 (0)