upload-labs17代码
<li id="show_code">
<h3>index.php代码</h3>
<pre>
<code class="line-numbers language-php">$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');
$file_name = $_FILES['upload_file']['name'];
$temp_file = $_FILES['upload_file']['tmp_name'];
$file_ext = substr($file_name,strrpos($file_name,".")+1);
$upload_file = $UPLOAD_ADDR . '/' . $file_name;
if(move_uploaded_file($temp_file, $upload_file)){
if(in_array($file_ext,$ext_arr)){
$img_path = $UPLOAD_ADDR . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
rename($upload_file, $img_path);
unlink($upload_file);
$is_upload = true;
}else{
$msg = "只允许上传.jpg|.png|.gif类型文件!";
unlink($upload_file);
}
}else{
$msg = '上传失败!';
}
}
</code>
</pre>
</li>
所以文件上传的逻辑:
检查是否设置了$_POST['submit'],用户已经提交了表单
定义允许上传的文件扩展名数组$ext_arr,这里只允许jpg、png、gif
获取上传文件的名称、临时路径和扩展名
尝试将上传的文件移动到指定的上传目录$UPLOAD_ADDR
如果文件移动成功,检查文件扩展名是否在允许的列表中
如果文件类型允许,重命名文件并删除原始文件。 如果文件类型不允许,删除上传的文件并设置错误消息
结合所学文件上传基本逻辑,应该是:
先制作图片马,用copy /b test.jpg + shell.php merged.jpg,然后上传这个图片马,直接访问上传后的文件
用Burp Suite拦截请求修改文件扩展名
重点在服务端的绕过
未完