一、什么是 点+空格+点 绕过
顾名思义,将 test.php 改为 test.php. . ,观察到后缀名php后多出了 点+空格+点。那么 点+空格+点 是如何进行绕过的,在什么情况下可以使用,让我们结合题目讲解。
二、代码审计
1、查看题目源代码上半部分,题目采取黑名单,并且对 Pass05 - Pass07 的题目中所出现的漏洞进行了有效修复,意味着我们不再能够使用 点绕过/空格绕过/大小写绕过了。
2、接着查看源代码下半部分,看起来和前面关卡并无不同,但其实题目源代码做了一个细小的修改,如图。题目将 $img_path中的 $file_ext 换成了 $file_name,就是这个细节,构成了 点+空格+点 漏洞。
三、点 + 空格 + 点 绕过原理
1、上传 test.php. . 文件,源代码的诸条指令开始对其进行操作。
2、首先 deldot() 函数将文件名的最后一个点删除,变为: test.php._ 。 _在这里表示空格。
3、strche() 函数提取最后一个点到字符串末尾的位置,即提取文件后缀名,并赋值给 $file_ext。但是文件最后一个点到末尾的字符串是 空字符,故提取的文件后缀名 $file_ext 也是空字符,这就可以对黑名单进行绕过了。
4、接着解释 $image_path 中的 $file_name 的问题,经过一系列操作后,$file_name 为 test.php,而 $file_ext 为空字符,如果这里写的是 $file_name,最终的 $image_path 应该形如:https://upload-labs/upload/test.php,反之,若写的是 file_ext,最终的 $image_path 应该形如:https://upload-labs/upload/ ,这会导致Apache什么都解析不出来,因为没有文件可以解析,upload 目录下为空。这就是 点+空格+点 绕过的局限性所在。
四、通关操作
1、首先上传 test.php 文件,利用 Burpsuite 进行抓包,在 filename 中添加 点+空格+点 进行黑名单绕过。
2、放包,文件上传成功,在新标签页中打开,将url后多出的 点和空格 删掉,发现代码执行成功。
---通关。