5-.点+空格+点绕过 || .user.ini绕过
php
$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 . '文件夹不存在,请手工创建!';
}
}
三种绕过方法
- 这里的绕过方法利用了Windows系统的特性。尽管源码做了去空格、去点等处理,但对于
. .这种特殊格式的清理并不彻底,导致文件名在检测后从shell.php. .变为shell.php.。Windows系统在保存文件时,会自动去掉文件名末尾的点和不影响识别的空格,最终保存为shell.php,从而实现了绕过。
-
如果Apache版本较老(1.x-2.x) ,还存在一个解析漏洞:当遇到无法识别的后缀时,会从右向左解析,直到识别出
.php后缀。你可以上传一个像shell.php.unknown这样的文件,利用这个解析漏洞来执行。**经过测试Apache 2.4.39版本不存在这个解析漏洞**
- 利用
.user.ini 动态包含 :.user.ini是PHP支持的配置文件,可以自动包含其他文件。但这也要求上传目录下必须有.php文件(例如readme.php)来触发包含,这是一种隐蔽性和成功率都较高的方法。
在操作前,需要确认环境是否满足以下条件:
-
PHP 运行模式必须为 CGI / FastCGI :。
phpinfo() 中的Server API值可以确认这一点。 -
目标路径下已存在一个正常的 PHP 文件 :
readme.php。 -
PHP 版本需为 5.3.0 或更高 :这是
.user.ini支持的最低版本。 -
.user.ini 文件本身 :上传时后缀名必须是.ini,并且该文件在黑/白名单之外(在upload-labs Pass-05中,.ini后缀不在黑名单内,因此允许上传)。 -
PHP 配置相关 :
php.ini 中user_ini.filename 未被设置为空字符串,user_ini.cache_ttl未设置为0。-
当
user_ini.filename 指令被注释或未显式设置时,PHP 会使用默认值:
user_ini.filename = ".user.ini"
user_ini.cache_ttl = 300(缓存 300 秒,即 5 分钟)
-
-
拥有足够的文件系统权限 :Web 服务器用户需要对目录有写入
.user.ini的权限
下面就是具体的操作了:
-
制作
.user.ini 文件 :创建一个名为.user.ini 的文本文件,内容如下,它告诉 PHP 去包含一个叫做shell.jpg的文件。auto_prepend_file = shell.jpg或者使用
auto_append_file指令,功能类似。 -
制作图片木马文件 :创建一个图片木马,比如
shell.jpg。用文本编辑器打开,在图片文件尾写入 PHP 代码。 -
依次上传文件 :先上传
.user.ini 文件。上传成功后,再上传图片木马shell.jpg。 -
触发 Webshell :访问该目录下的
readme.php