upload第五关代码解析的问题

upload靶场第5关的绕过问题,网上教程说是在.php后面加上. .但是理解不了为啥能绕过。

img


比如我上传一个1.php. .文件。

 $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); //首尾去空

这段过滤代码中,首先获取了文件名1.php. .然后删除文件末尾点后不就变成了1.php. 但下面$file_ext=strrchr($file_name, '.');然后该函数不是应该获取到的是. 的字符串吗(有个空格)?,最后再去空,$file_ext的值不应该是.吗?
想知道是我代码理解错了吗?

$file_ext这个变量是从你上传的文件名的变量中提取出的后缀,出题人使用deldot函数(从字符串的尾部开始,从后向前删除点.,直到该字符串的末尾字符不是.为止。)本意是想着,删掉shell.php..中的后两个. 从而使得做题人上传的.php非法文件被识别出来。但是,这道题的绕过方法是在两个.中间加了一个空格,这就充分利用了deldot函数的特性,使得deldot函数只是过滤掉了最后的一个. 使得我们上传的shell.php. (还剩下.和空格),这样题目获取后缀的时候,获取的就是. (点+空格)而不是.php,点+空格不在deny_ext变量中,所以我们上传的文件会顺利到达服务器内部,但是由于windows系统的特性,文件名会直接忽略(点+空格),从而使得我们的文件名从shell.php. 直接编程shell.php,这就造成了任意文件上传漏洞

没看出来 这段代码要达到什么目的?是去找文件后缀吗!那你获取一个.是为什么?
其次对于绕过问题,可以转换思路,使用白名单,即只允许设置的后缀名文件上传,其他的提示不允许!