此文章只用于学习和反思巩固文件上传漏洞知识,禁止用于做非法攻击。注意靶场是可以练习的平台,不能随意去尚未授权的网站做渗透测试!!!
前几关源代码是验证去除末尾点、首尾去空、大小写过滤以及data流过滤。都是基于window特性绕过的。这一关的源代码就不太一样了,让我们瞧一瞧。
$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","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess","ini");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = str_ireplace($deny_ext,"", $file_name);
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
发现源代码大改,和之前不一样了。发现这串核心代码$file_name = str_ireplace($deny_ext,"", $file_name);
意思是如果上传的文件后缀名在黑名单中,就会把此后缀名替换为空。但是这个代码只执行一次,那么我双写后缀名是不是就可以绕过了呢。
因为php在黑名单里,应该会被替换为空。我们先上传123.php,看看是不是我们所说的把php后缀名替换为空。(如图所示)
发现是被替换了,那么我们就有思路了。如果后缀名是pphphp是不是就会把中间的php替换为空,最终变成php后缀名了呢?我们试一试(如图所示)
这一关利用的是由于验证代码中只验证了一次,造成我们可以双写进行绕过,就和之前点空格绕过一样,因为只验证一次,我们可以多写来绕过。此文章是小白自己为了巩固文件上传漏洞而写的,大佬路过请多指教!