pass-01
function checkFile() {
var file = document.getElementsByName('upload_file')[0].value;
if (file == null || file == "") {
alert("请选择要上传的文件!");
return false;
}
//定义允许上传的文件类型
var allow_ext = ".jpg|.png|.gif";
//提取上传文件的类型
var ext_name = file.substring(file.lastIndexOf("."));
//判断上传文件类型是否允许上传
if (allow_ext.indexOf(ext_name + "|") == -1) {
var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
alert(errMsg);
return false;
}
}
•代码理解
1、函数checkFile验证用户选择的文件是否符合要求
function checkFile() {
var file = document.getElementsByName('upload_file')[0].value;
获取文件名:这行代码获取页面上名为 upload_file 的文件输入框的值,即用户选择的文件的路径。
2、检查是否选择了文件
if (file == null || file == "") {
alert("请选择要上传的文件!");
return false;
}
如果用户没有选择文件(即 file 为 null 或空字符串),则弹出提示框,要求用户选择一个文件,并返回false,停止执行后续代码。
3、定义允许的文件类型
var allow_ext = ".jpg|.png|.gif";
这里定义了一个字符串,列出了允许上传的文件扩展名(.jpg, .png, .gif),用竖线 | 分隔。
4、提取文件扩展名
var ext_name = file.substring(file.lastIndexOf("."));
这行代码通过 lastIndexOf 方法找到最后一个 . 的位置,从而提取文件的扩展名。
5、检查文件扩展名是否允许
if (allow_ext.indexOf(ext_name + "|") == -1) {
var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
alert(errMsg);
return false;
}
这部分代码检查提取的扩展名是否在允许的扩展名列表中。如果不在,则弹出一个错误消息,告知用户当前文件类型不被允许,并要求上传合适类型的文件。
•步骤:
禁用JavaScript

上传

访问地址

pass-02
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name']
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '文件类型不正确,请重新上传!';
}
} else {
$msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';
}
}
•代码理解
$_FILS
• 超全局变量$_FILES是一个二维数组,用来保存客户端上传到服务器的文件信息。二维数组的行是文件域的名称,列有5个。
1)、$FILES[]['name'] #上传的文件名
2)、$FILES[]['type'] #上传的文件类型,这个类型是MIME类型(image/jpeg image/gif image/png)
3)、$FILES[]['size'] #文件的大小,以字节为单位
4)、$FILES[]['tmp_name'] #文件上传时候的临时文件
5)、$_FILES[]['error'] #错误编码(值有0、1、2、3、4、6、7)0表示正确1
1. 变量初始化
$is_upload = false;
$msg = null;
-
$is_upload是一个布尔值,默认值为false,用来表示文件是否成功上传。 -
$msg用于存储上传过程中出现的错误信息,初始化为null。
2. 检查表单提交
if (isset($_POST['submit']))
-
这段代码检查是否通过
POST请求提交了表单。如果表单被提交,$_POST['submit']会被设置,因此代码进入判断块。
3. 检查上传目录是否存在
if (file_exists(UPLOAD_PATH))
-
UPLOAD_PATH是上传文件存储目录的路径。这里检查该目录是否存在。如果目录存在,则继续处理文件上传。如果目录不存在,后续的上传操作将会失败,错误信息会被设置为"文件夹不存在,请手工创建!"。
4. 验证文件类型
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif'))
-
这段代码验证上传的文件类型是否为
jpeg、png或gif。$_FILES['upload_file']['type']包含了上传文件的 MIME 类型。如果文件类型符合要求,代码将继续处理上传。 -
如果文件类型不符合要求,错误信息会被设置为
"文件类型不正确,请重新上传!"。
5. 获取临时文件路径和目标路径
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name'];
-
$temp_file存储了上传文件的临时路径,这个路径是服务器保存上传文件的临时位置。 -
$img_path是上传文件的目标路径,将文件保存到UPLOAD_PATH指定的目录下,文件名与用户上传时的文件名相同。
6. 移动文件
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
-
move_uploaded_file()函数将临时文件移动到目标目录。如果文件成功移动,$is_upload被设置为true,表示文件上传成功。 -
如果文件移动失败,错误信息
$msg被设置为"上传出错!"。
7. 上传目录不存在的错误处理
} else {
$msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';
}
-
如果检查到
UPLOAD_PATH目录不存在,错误信息会被设置为"UPLOAD_PATH 文件夹不存在, 请手工创建!",提醒用户手动创建该目录。
•步骤:
抓包


修改为image/jpeg

上传


pass-03
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array('.asp','.aspx','.php','.jsp');
$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); //收尾去空
if(!in_array($file_ext, $deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
if (move_uploaded_file($temp_file,$img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
•代码理解:
1. 初始化变量
$is_upload = false;
$msg = null;
-
$is_upload是一个布尔变量,表示文件是否成功上传。初始值为false。 -
$msg用于存储上传过程中的错误消息,初始值为null。
2. 检查表单提交
if (isset($_POST['submit'])) {
-
这段代码检查是否通过
POST请求提交了一个表单。如果表单被提交,$_POST['submit']将被设置,因此会进入这个判断块。
3. 检查上传目录是否存在
if (file_exists(UPLOAD_PATH)) {
-
UPLOAD_PATH是用于保存上传文件的目录路径。file_exists()检查该路径的文件夹是否存在。如果目录存在,代码继续执行。如果目录不存在,则返回错误信息,要求用户手动创建该目录。
4. 定义不允许上传的文件扩展名
$deny_ext = array('.asp','.aspx','.php','.jsp');
-
$deny_ext是一个包含不允许上传的文件扩展名的数组。这里列出了.asp、.aspx、.php和.jsp等扩展名,这些文件类型通常可能被用于执行服务器端脚本,因此不允许上传。 -
在某些特定环境中某些特殊后缀仍会被当作php文件解析 php、php2、php3、php4、php5、php6、php7、pht、phtm、phtml。
5. 获取上传文件的扩展名并进行处理
$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); // 收尾去空
-
$_FILES['upload_file']['name']获取用户上传的文件名。 -
trim()去除文件名两端的空白字符。 -
deldot($file_name)可能是一个自定义的函数,用于删除文件名末尾的点(例如,如果文件名是image.,则会去掉末尾的点)。注意这个函数并不是 PHP 的内置函数,你需要查看它的定义才能确认它的具体作用。 -
strrchr($file_name, '.')用于获取文件名中最后一个点(.)之后的部分,即文件的扩展名。 -
strtolower($file_ext)将扩展名转换为小写,确保文件类型验证时不受大小写影响。 -
str_ireplace('::$DATA', '', $file_ext)这个步骤用于去除上传文件名中可能存在的恶意字符串::$DATA。这是某些操作系统(如 Windows)中可能存在的文件特性,攻击者可能利用这一点上传恶意文件,因此需要去除。 -
trim($file_ext)去除扩展名两边的空白字符。
6. 检查文件扩展名是否允许上传
if (!in_array($file_ext, $deny_ext)) {
-
in_array()检查上传的文件扩展名是否在$deny_ext数组中。如果扩展名在数组中,表示该文件类型不允许上传,后续上传操作将被阻止。
7. 处理文件上传
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' . date("YmdHis") . rand(1000, 9999) . $file_ext;
-
$_FILES['upload_file']['tmp_name']获取文件在服务器上的临时文件路径。 -
$img_path
构建文件保存的目标路径:
-
使用
date("YmdHis")获取当前时间(年-月-日 时-分-秒)作为文件名的前缀,确保文件名唯一。 -
rand(1000, 9999)生成一个 1000 到 9999 之间的随机数,进一步保证文件名的唯一性。 -
使用上传文件的扩展名
$file_ext作为文件的后缀名,确保文件保存时使用正确的扩展名。
-
8. 移动文件到目标目录
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
-
move_uploaded_file()将上传的临时文件从临时目录移动到目标目录$img_path。 -
如果文件成功移动,设置
$is_upload = true,表示上传成功。 -
如果移动失败,设置错误消息
$msg为'上传出错!'。
9. 错误处理
} else {
$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
}
-
如果文件的扩展名在禁止上传的类型列表中,设置错误消息为
'不允许上传.asp,.aspx,.php,.jsp后缀文件!'。
10. 上传目录不存在时的错误处理
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
-
如果
UPLOAD_PATH目录不存在,设置错误消息为'文件夹不存在,请手工创建!'。
•步骤:
抓包,改成.php5

上传

pass-04
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".ini");
$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); //收尾去空
if (!in_array($file_ext, $deny_ext)) {
$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 = '此文件不允许上传!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
•代码理解(与pass-03类似):
$deny_ext:定义一个数组,其中列出了所有禁止上传的文件扩展名(".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".ini")
•步骤:
上传.png文件
上传.htaccess文件(将.png格式的文件以解析php文件的方式来解析)


pass-05
$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",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
$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); //首尾去空
if (!in_array($file_ext, $deny_ext)) {
$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 = '此文件类型不允许上传!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
•代码理解:
$deny_ext:定义一个数组,其中列出了所有禁止上传的文件扩展名
".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess"
$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); //首尾去空
•步骤:
上传、抓包php文件
修改为php. .

删除末尾的点,转换为小写,去除字符,去除空格之后为php.文件,可进行绕过。


pass-06
$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",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess",".ini");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //首尾去空
if (!in_array($file_ext, $deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '此文件类型不允许上传!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
没有转换大小写
•步骤:
上传.php文件抓包,改为大写



pass-07
$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",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess",".ini");
$file_name = $_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
if (!in_array($file_ext, $deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
if (move_uploaded_file($temp_file,$img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '此文件不允许上传';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
没有删空格
•步骤:
上传.php文件抓包,加空格。



pass-08
$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",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess",".ini");
$file_name = trim($_FILES['upload_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); //首尾去空
if (!in_array($file_ext, $deny_ext)) {
$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 = '此文件类型不允许上传!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
没有去除末尾的点
•步骤:
上传.php文件抓包,在php末尾加.



pass-09
$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",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess",".ini");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = trim($file_ext); //首尾去空
if (!in_array($file_ext, $deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '此文件类型不允许上传!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
没有过滤“::$DATA”
•步骤:
上传.php文件抓包,加上::$DATA



pass-10
$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",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess",".ini");
$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); //首尾去空
if (!in_array($file_ext, $deny_ext)) {
$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 = '此文件类型不允许上传!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
•步骤:
上传.php文件抓包,加php
将一个php去掉后,然后拼接了一个新的php



1384

被折叠的 条评论
为什么被折叠?



