upload-labs第20关详解

拿到题目,首先分析源码.

题目

获取了一个post参数save_name作为文件名称.进行操作,这里有一个逻辑漏洞.后台先是对file进行判断,如果不是数组才会对他进行分割.

那么如果我们直接传入一个数组会怎么样呢?

尝试上传

成功上传

但是

为什么这样就能成功上传?我又读了一遍代码,代码逻辑应该是没问题的啊?也就是说,即使我们用post方式传递的是数组也应该能正确执行才对啊.

调试代码

在头部添加开启报错信息

error_reporting(-1);
ini_set('display_errors', 1);

添加调试信息

echo '<p>长度: '.count($file).'</p>';
echo '<p>数组: '.print_r($file).'</p>';
echo '<p>count -1'.$file[count($file) - 1].'</p>';
echo '<p>count -2'.$file[count($file) - 2].'</p>';
echo '<p>count -3'.$file[count($file) - 3].'</p>';
echo '<p>0 :'.$file[0].'</p>';
echo '<p>1 :'.$file[1].'</p>';
echo '<p>2 :'.$file[2].'</p>';

添加调试信息

再次上传,看一下输出

输出内容

注意一下这个地方,数组长度为2,数组内容为Array ( [0] => upload-20.jpg [2] => jpg ).

问题好像出来了.从这一行可以看出这个数组好像不是一个索引数组,而是一个关联数组.而且是以数字类型为关联键.

这也正是为什么调用$file[count($file)-1]的时候会返回空.因为count($file)的值为2,整个语句就是$file[1].而file数组作为一个关联数组只有0和2两个键,没有名为1的建,所以只能返回空.后面作为后缀名拼接的时候就只有前面的$file[0]作为文件名.

好可爱~