关注这个靶场的其它相关笔记:UPLOAD LABS —— 靶场笔记合集-CSDN博客
0x01:过关流程
本关的目标是上传一个 WebShell 到目标服务器上,并成功访问:
查看源码,我们发现了,其上传文件名是通过 $_POST['save_path']
获取的,且其采用了黑名单校验,如果你上传的文件名后缀不在黑名单内,你的文件就会被服务端保存:
通过了前 19 关历练的你,相信一眼就能找到本关的 Bug:
-
Bug 01:黑名单过滤不全,其并没有过滤
.ini
后缀,我们可以通过上传配置文件.user.ini
进行绕过。(::$DATA
也没过滤) -
Bug 02:
pathinfo
仅仅是获取后缀,通过抓包可以发现目标运行在 Windows 系统上,利用 Windows 移除文件扩展名多余.
的特性,我们也可以进行绕过。
下面,笔者就用 Bug 02 过关吧(比较简单)。
首先,上传一个一句话木马文件,并修改保存名称为 shell.php.
,这样其后端在获取 $file_ext
时就会获得一个空的结果,该结果肯定不在黑名单中,所以成功绕过:
如上,我们已经成功上传了 shell.php
,下面使用 “中国蚁剑” GetShell(如下,成功 GetShell,本关结束):
0x02:源码分析
下面是本关的 WAF 源码,采用黑名单校验方式。怎么说呢,黑名单不全,对后缀的处理也不咋地:
$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","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");$file_name = $_POST['save_name'];$file_ext = pathinfo($file_name,PATHINFO_EXTENSION);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 . '文件夹不存在,请手工创建!';}}