用户
搜索
  • TA的每日心情
    开心
    昨天 09:43
  • 签到天数: 110 天

    连续签到: 9 天

    [LV.6]常住居民II

    i春秋-见习白帽

    Rank: 3Rank: 3

    1

    主题

    31

    帖子

    1862

    魔法币
    收听
    2
    粉丝
    2
    注册时间
    2016-11-8
    发表于 2020-9-3 20:46:12 64936
    本帖最后由 ofei 于 2020-9-3 20:54 编辑

    前言

    今天看到EDI安全的一篇phpstudy漏洞分析原因到修复分析phpstudy8.1.0.7版本存在的安全问题一文,觉得挺有意思,之前又没有玩过php,就拿他练练手,有一些意外发现,写出来大家一起讨论。

    一、漏洞复现

    测试环境:

    Winodws server 2008 R2
    Phpstudy 8.1.0.7

    我们先下载PhpStudy版本,默认安装后删除www目录默认的文件,顺手把之前的文件上传靶场upload-labs放到www目录,启动phpstudy,启动nginx和mysql服务。
    1.png
    访问正常,表示部署成功
    准备一句话图片,1.png,内容如下:

    <?php @eval($_GET['ichunqiu']); ?>

    http://localhost/Pass-01/index.php,页面上传图片上传后路径:/upload/1.png
    访问:http://localhost/upload/1.png/1.php?ichunqiu=phpinfo();
    2.png
    成功复现。

    二、原因分析

    phpstudy漏洞分析原因到修复一文,分析漏洞原因为nginx解析漏洞,影响版本为Nginx 0.8.41~1.4.3 / 1.5.0~1.5.7,而phptudy8 的nginx版本为1.15.11是不存在解析漏洞的,难道版本是假的?命令行查看nginx版本为1.15.11没有问题。
    3.png
    再看原文分析的影响版本Nginx 0.8.41~1.4.3 / 1.5.0~1.5.7,这个应该是CVE-2013-4547,这个cve解释为

    nginx 0.8.41 through 1.4.3 and 1.5.x before 1.5.7 allows remote attackers to bypass intended restrictions via an unescaped space character in a URI.
    翻译过来就是Nginx 0.8.41~1.4.3 / 1.5.0~1.5.7 允许远程攻击者通过URI中的未转义空格字符来绕过预期的限制。

    php.ini的默认配置;cgi.fix_pathinfo=1为注释状态,不配置默认为1

    4.png
    所以这是一个典型的配置错误组合,导致的安全问题。
    作者之所以误判可能与这篇广为流传的文章有关。http://www.91ri.org/9064.html
    作者后续也给出正确的分析:
    1、由于nginx的配置(nginx.conf包含vhosts下所有conf文件)导致nginx把以'.php'结尾的文件交给fastcgi处理,为此可以构造http://ip/uploadfiles/test.png/.php (url结尾不一定是'.php',任何服务器端不存在的php文件均可,比如'a.php'),其中test.png是我们上传的包含PHP代码的照片文件。

    2、但是fastcgi在处理'.php'文件时发现文件并不存在,这时php.ini配置文件中cgi.fix_pathinfo=1 发挥作用,这项配置用于修复路径,如果当前路径不存在则采用上层路径。为此这里交由fastcgi处理的文件就变了'/test.png’。

    3、最重要的一点是php-fpm.conf(windows中没有此配置文件)中的security.limit_extensions配置项限制了fastcgi解析文件的类型(即指定什么类型的文件当做代码解析),此项设置为空的时候才允许fastcgi将'.png'等文件当做代码解析。


    对比8.1.1.1和8.1.0.7发现,8.1.1.1在fastcgi.conf 最后添加了一行try_files $fastcgi_script_name =404;而未在nginx配置文件中包含此文件。
    因此phpstudy 最新版8.1.1.1 存在同样问题

    三、加固

    知道了漏洞的原因就可以在利用链上加障碍,个人总结的加固方法如下:
    1、nginx配置正则过滤不让nginx转发恶意请求(可能会被绕过)
    或location配置配置try_files    $uri $uri/ =404;找不到文件直接返回(推荐

    2、nginx中location配置include fastcgi.conf;配置fastcgi.conf中定义try_files$fastcgi_script_name=404;跟1思路一样只不过需要配置两个位置

    3、 将php.ini文件中的cgi.fix_pathinfo的值设置为0,这样php再解析/1.jpg/1.php这样的目录时,只要1.php不存在就会显示404页面。
    需要注释掉fastcgi_param PATH_TRANSLATED document_root$fastcgi_path_info;
    4、 php-fpm.conf中的security.limit_extensions后面的值设置为.php(linux服务器可配置)推荐

    发表于 2020-9-4 10:25:28
    写的不错
    使用道具 举报 回复
    发表于 2020-9-4 11:39:19

    谢谢支持
    使用道具 举报 回复
    发表于 2020-9-4 11:41:12
    同时发现,在线更新与从官网下载的8.1.1.1版本存在fastcgi_params文件的差异,在线更新的8.1.1.1没问题,新下的有问题,官方的锅
    使用道具 举报 回复
    发表于 2020-9-4 14:17:15
    ofei 发表于 2020-9-4 11:41
    同时发现,在线更新与从官网下载的8.1.1.1版本存在fastcgi_params文件的差异,在线更新的8.1.1.1没问题,新 ...

    哦豁?
    使用道具 举报 回复
    发表于 2020-9-6 19:21:03
    更新:官网最新版已修复
    使用道具 举报 回复
    发表于 2020-9-10 17:58:41
    写的不错师傅
    欢迎各位师傅们关注EDI安全
    欢迎关注公众号:EDI安全  渗透测试 内网渗透 SRC漏洞分享,安全武器库 安全开发
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册