• nginx文件类型错误解析漏洞 cgi.fix_pathinfo


     

    链接:http://blog.csdn.net/ws_zll/article/details/7552916

     

    问题简介:
    nginx是一款高性能的web服务器,使用非常广泛,其不仅经常被用作反向代理,也可以非常好的支持PHP的运行。nginx默认以cgi的方式支持 php的运行,而为了较好的支持PATH_INFO的提取,在PHP的配置选项里存在cgi.fix_pathinfo选项,其目的是为了从 SCRIPT_FILENAME里取出真正的脚本名,而攻击者则利用这点可以将任何类型的文件以PHP的方式进行解析。
    影响版本:0.5.*, 0.6.*, 0.7 <= 0.7.65, 0.8 <= 0.8.37  ,目前我们版本在1.1以上。

    举例说明:
    假设test.king.com是一个论坛,可以上传图片操作(后台有bug并没有对图片进行判断处理),用户已经上传一张包含php脚本的图片abc.jpg

    现将test.king.com修定本地
    浏览器访问test.king.com/abc.jpg,此时会显示无法浏览此图片
    现访问test.king.com/abc.jpg/c.php 或者test.king.com/abc.jpg%00.php 则会将abc.jpg当做脚本文件直接运行,会显示出abc.jpg里的脚本代码phpinfo()信息
    (以上只限测试,如有人想尝试,可在虚拟机上运行)
    原理:
    nginx在接受请求后会得到一个地址URL/abc.jpg/c.php
    在经过location指令,将请求交给fastcgi处理,nginx为其设置环境变量SCRIPT_FILENAME,内容为/abc.jpg/c.php
    后端的fastcgi在接受到该选项时,会根据PHP的fix_pathinfo配置决定是否对SCRIPT_FILENAME进行额外的处理,一般情况下如果不对fix_pathinfo进行设置将影响使用PATH_INFO进行路由选择的应用,

    所以该选项一般配置开启。Php通过该选项之后将查找其中真正的脚本文件名字,查找的方式也是查看文件是否存在,这个时候将分离SCRIPT_FILENAME和PATH_INFO分别为/scripts/abc.jpg和c.php
    最后,以/scripts/abc.jpg作为此次请求需要执行的脚本,攻击者就可以实现让nginx以php来解析任何类型的文件了。

    解决:

    关闭php.ini里的cgi.fix_pathinfo为0
    或者
    if ( $fastcgi_script_name ~ ..*/.*php ) {
    return 403;
    }
    前两个可能会导致一些伪静态网页或者特殊的路径无法显示

    宴哥提供了一个方法可写在fcgi.conf文件中,便于多个虚拟主机引用
    if ($request_filename ~* (.*).php) {
        set $php_url $1;
    }
    if (!-e $php_url.php) {
        return 403;
    }

  • 相关阅读:
    子集和的另外一个问题
    LCS
    表达式求值
    Singleton in java
    自绘ListBox的两种效果
    动态创建、压缩Access数据库(*.MDB)
    C# 中用stopwatch测试代码运行时间
    MVC学习笔记之数据传递
    ATM应用实现
    html的基本语法
  • 原文地址:https://www.cnblogs.com/dami520/p/2651113.html
Copyright © 2020-2023  润新知