现在普遍的Nginx + PHP cgi的做法是在配置文件中, 通过正则匹配Nginx(PHP/fastcgi的PATH_INFO问题,设置SCRIPT_FILENAME, 今天发现了一个这种方式的安全漏洞.

为什么会这样呢?

比如, 如下的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_NAME $script;

fastcgi_param PATH_INFO $path_info;

}

通过正则匹配以后, SCRIPT_NAME会被设置为”fake.jpg/foo.php”, 继而构造成SCRIPT_FILENAME传递个PHP CGI, 但是PHP又为什么会接受这样的参数, 并且把a.jpg解析呢?

这就要说到PHP的cgi SAPI中的参数, fix_pathinfo了:

; cgi.fix_pathinfo provides real PATH_INFO/PATH_TRANSLATED support for CGI. PHP's

; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok

; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting

; this to 1 will cause PHP CGI to fix it's paths to conform to the spec. A setting

; of zero causes PHP to behave as before. Default is 1. You should fix your scripts

; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.

cgi.fix_pathinfo=1

如果开启了这个选项, 那么就会触发在PHP中的如下逻辑:

/*

if the file doesn't exist, try to extract PATH_INFO out

of it by stat'ing back through the '/'

this fixes url's like /info.php/test

*/

if (script_path_translated &&

(script_path_translated_len = strlen(script_path_translated)) > 0 &&

(script_path_translated[script_path_translated_len-1] == '/' ||

....//以下省略.

到这里, PHP会认为SCRIPT_FILENAME是fake.jpg, 而foo.php是PATH_INFO, 然后PHP就把fake.jpg当作一个PHP文件来解释执行… So…

这个隐患的危害用小顿的话来说, 是巨大的.

对于一些论坛来说, 如果上传一个图片(实际上是恶意的PHP脚本), 继而构造这样的访问请求…

所以, 大家如果有用这种服务器搭配的, 请排查, 如果有隐患,

请关闭fix_pathinfo(默认是开启的).

cgi.fix_pathinfo=0

php cgi漏洞,Nginx + PHP CGI的一个可能的安全漏洞相关推荐

  1. CentOS Linux 7 配置 nginx 支持 CGI

    Nginx 本身不能执行外部程序,Nginx 处理 PHP 是通过 PHP 的 fastcgi 管理器(php-fpm)进行处理,然后 nginx 再将结果返回给用户:所以如果我们需要通过 cgi 程 ...

  2. nginx配置cgi

    CGI 通用网关接口(Common Gateway Interface/CGI)描述了客户端和服务器程序之间传输数据的一种标准.wiki Common_Gateway_Interface 这个 Web ...

  3. linux cgi c环境配置,Linux下配置nginx支持.cgi | 系统运维

    说明: 操作系统:CentOS 6.x web环境:php+nginx+mysql nginx安装目录:/usr/local/nginx nginx配置文件:/usr/local/nginx/conf ...

  4. C++ Web 编程 CGI公共网关接口(CGI):第一个 CGI 程序

    Table of Contents C++ Web 编程 什么是 CGI? Web 浏览 CGI 架构图 Web 服务器配置 第一个 CGI 程序 Hello World! 这是我的第一个 CGI 程 ...

  5. linux cgi转发串口数据库,CGI连接数据库的方法

    毫无疑问,当今Web程序设计中最吸引人而且最复杂的当然就是web数据库程序了.平心而论,其复杂高深的程度决不是你们可以想象得到的.我们先来看看其中涉及到的几个方面的问题: 1.最基本的html设计 2 ...

  6. python的cgi配置教程_Python CGI环境在不同操作系统中配置方法

    我们今天主要为大家介绍的是有关Python CGI环境在不同操作系统中的配置方法.相信对于大多数开发人员来说,都急切的需要掌握这一应用技术.接下来就让我们一起来看看具体的应用方法吧. CGI 代表CO ...

  7. c语言 cgi php,C语言CGI编程入门(一)

    CGI是指web服务器调用编程语言编写的程序的一个接口.比如我们可以编写一个用户注册的页面,用户将其输入的邮箱.用户名.密码输入并点击注册,此时浏览器就将用户输入的内容发送给了我们后台的CGI程序,我 ...

  8. 打开cgi文件的网络服务器,cgi文件怎么打开 .cgi是什么文件 | 帮助信息-动天数据...

    cgi文件怎么打开 .cgi是什么文件 作者:dthost | 时间:2017-12-14 | 分类:未分类 | 18,533 次阅读 cgi格式文件是"公共网关接口脚本"类型文件 ...

  9. 为修复一个代码执行安全漏洞,TensorFlow决定不再支持YAML

    TensorFlow是谷歌开发的基于Python的机器学习和人工智能项目.为修复一个代码执行安全漏洞,TensorFlow决定不再支持YAML.YAML(Yet Another Markup Lang ...

最新文章

  1. Android中的ViewDragHelper
  2. 15.2. NFS Client Configuration
  3. C#网页数据采集(三)HttpWebRequest
  4. myFocus制作焦点图
  5. probuffer java_Protocol Buffer的使用
  6. oracle检查完系统要求不动,w10安装oracle, 正在检查操作系统要求... 实际结果: 6.2...
  7. Windows学习总结(19)——Windows必备神器Cmder使用教程
  8. 跟着图灵去听课——海底捞敏捷之道纪要
  9. 自己实现java I/O中的BufferedReader对象中的raedLine方法
  10. POJ NOI0101-08 字符三角形
  11. 【编程知识】常用参考表对照表
  12. matlab2016b慢,Matlab 2016a/b中调用GPU速度巨慢的解决办法
  13. [python]LDA模型使用流程及代码
  14. 多媒体计算机中的扬声器指的是音箱和,多媒体音箱还以为只是个喇叭,原来这么多名堂...
  15. 【传感器】BMA253 数字,三轴加速度传感器
  16. 基于JAVA的网上花店销售系统的设计与实现(附:源码 论文 sql文件)
  17. LaTex常用技巧6:矩阵编写总结
  18. react浏览器兼容报错处理
  19. java反编译+回编教程
  20. 【判断题】【简答题】【数据库原理】

热门文章

  1. long类型20位示例_Java Long类numberOfTrailingZeros()方法及示例
  2. Spring IoC?看这篇文章就够了...
  3. 99%的程序员都在用Lombok,原理竟然这么简单?我也手撸了一个!|建议收藏!!!...
  4. C#获取屏幕大小的“简单整理”。。
  5. maven识别包下的xml
  6. 模板全特化和偏特化用法
  7. Linux下调tcp最大参数
  8. ACM 博弈专题(5种模板)
  9. python numpy库是第三方库吗_浅谈python的第三方库——numpy(终)
  10. 文字描边_6招迅速做出炫酷PPT字效!|10分钟干货第二期(文字描边)