关注这个靶场的其它相关笔记:UPLOAD LABS —— 靶场笔记合集-CSDN博客
0x01:过关流程
本关的目标是上传一个 WebShell 到目标服务器上,并成功访问:
通过查看源码,可以发现,本关在之前所有关卡的基础上做了过滤,过滤的还是比较全面的:
但是仔细分析一下代码,“删除文件末尾的点” 这一段会不会存在 Bug?带入一下开发者视角,我为什么要删除文件末尾的点?以及我如何删除文件末尾的点?
开发者视角:我为什么要删除文件末尾的点?
因为 Windows 系统特性,其会将文件末尾的点自动去除。攻击者可能会利用此特性构造诸如
muma.php.
,muma.php...
这样的文件进行绕过。
开发者视角:我如何删除文件末尾的点?
首先想到
.
后一般会跟文件的扩展名,如.php
。而攻击者通过.
进行绕过,一般点都在末尾,且其后一般不会跟东西,比如像这种:muma.php.
。那么我们就可以从后往前,按位删,碰到单独的
.
就往前删一个,如果碰到的字符不是.
就停止删除,最终将muma.php....
变为muma.php
后再进行后续的操作。
一切的安全都是基于假设,如果假设前提错误,那么安全也就成了泡影。在上面的头脑风暴中,开发者知道 Windows .
的特性,所以针对该特性进行了防御。但也仅仅针对了该特性进行防御。
我们在前面几关中知道了 Windows 文件名末尾的空格特性,即你在 Windows 文件后追加空格也会被系统自动去除。
那么联动一下这两个特性,就可以让开发者的防御荡然无存。开发者认为攻击者利用 .
绕过,所以过滤了文件名末尾是连续的点,但是倘若我在这多个点之间加个空格,是不是就变得不一样了。它的过滤方式就失效了。
下面开始进行攻击,首先上传一个.php
文件,并使用 BurpSuite 进行抓包:
重放请求包,往文件名后添加 . .
(点 - 空格 - 点)进行绕过:
如上,成功上传 muma.php. .
文件,下面我们使用 ”中国蚁剑“ 来连接一下木马,看看能否 Get Shell(如下,Get Shell 成功,本关结束):
0x02:源码分析
下面是本关 WAF 源码,其在前几关的基础上做了比较完善的过滤,但是由于其开发者假设错误,导致攻击者可以利用多个 Windows 特性进行组合攻击,下面对着代码笔者分析一下 muma.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",".ini");// $file_name = "muma.php. ."$file_name = trim($_FILES['upload_file']['name']);// $file_name = "muma.php. " # 删除文件名末尾的点,碰倒空格就结束逻辑了$file_name = deldot($file_name);//删除文件名末尾的点// $file_ext = ". " # 系统获取 . 最后出现的位置到结束的字符,结果取了个 .空格$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'];// 这里拼接后的路径为 "UPLOAD_PATH/muma.php. " => 后面就交给 Windows 系统特性帮你删除文件末尾的点和空格了$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 . '文件夹不存在,请手工创建!';}}