现在普遍的Nginx + PHP cgi的做法是在配置文件中, 通过正则匹配(Nginx(PHP/fastcgi)的PATH_INFO问题)设置SCRIPT_FILENAME, 今天小顿发现了一个这种方式的安全漏洞.
比如, 有http://www.laruence.com/fake.jpg, 那么通过构造如下的URL, 就可以看到fake.jpg的二进制内容:
- http://www.laruence.com/fake.jpg/foo.php
为什么会这样呢?
比如, 如下的nginx conf:
- location ~ \.php($|/) {
- fastcgi_pass 127.0.0.1:9000;
- fastcgi_index index.php;
- set $script $uri;
- set $path_info "";
- if ($uri ~ "^(.+\.php)(/.*)") {
- set $script $1;
- set $path_info $2;
- }
- include fastcgi_params;
- fastcgi_param SCRIPT_FILENAME $document_root$script;
- fastcgi_param SCRIPT_N