5-.点+空格+点绕过 || .user.ini绕过
$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