1.无验证
2.前端验证
function checkfilesuffix() //定义了一个名为 checkfilesuffix 的函数
{
var file=document.getElementsByName('file')[0]['value'];
//通过 document.getElementsByName 方法获取名为 'file' 的表单元素的第一个输入框的值,即用户选择的文件路径。
if(file==""||file==null)
{
alert("请添加上传文件");
return false;
}
//判断用户是否选择了文件,如果文件路径为空字符串或者为 null,则弹出提示框告诉用户需要添加上传文件,并返回 false 结束函数。
else
{
var whitelist=new Array(".jpg",".png",".gif");
//定义一个数组 whitelist,包含允许上传的文件后缀。
var file_suffix=file.substring(file.lastIndexOf("."));
//获取文件路径中最后一个点(.)之后的部分,即文件的后缀名。
if(whitelist.indexOf(file_suffix) == -1)
//使用 indexOf 方法检查文件后缀是否在 whitelist 数组中,如果不存在则返回 -1。
{
alert("该文件不允许上传");
//如果文件后缀不在允许的列表中,弹出提示框告诉用户该文件不允许上传。
return false;
//返回 false,表示文件检查未通过
}
}
}
只能上传.jpg,.png,.gif三种格式的文件,前端上传jpg,修改数据包进行上传
3.htaccess
介绍:hatccess文件,.htaccess是Apache的又一特色。
● 一般来说,配置文件的作用范围都是全局的,但Apache提供了一种很方便的、可作用于当前目录及其子目录的配置文件——.htaccess(分布式配置文件),
● 提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。
● 作为用户,所能使用的命令受到限制。
● 简单来说,就是我上传了一个.htaccess文件到服务器,那么服务器之后就会将特定格式的文件以php格式解析。
if (!empty($_POST['submit']))
//检查表单中名为 'submit' 的POST数据是否不为空,即用户是否点击了提交按钮。
{
$name = basename($_FILES['file']['name']);
//使用 basename 函数获取上传文件的原始文件名。
$ext = pathinfo($name)['extension'];
//使用 pathinfo 函数获取文件的扩展名
$blacklist = array("php", "php7", "php5", "php4", "php3", "phtml", "pht", "jsp", "jspa", "jspx", "jsw", "jsv", "jspf", "jtml", "asp", "aspx", "asa", "asax", "ascx", "ashx", "asmx", "cer", "swf");
//定义一个黑名单数组,包含不允许上传的文件扩展名,主要是为了防止执行脚本文件。
if (!in_array($ext, $blacklist))
//使用 in_array 函数检查文件扩展名是否在黑名单中,如果不在,则允许上传。
{
if (move_uploaded_file($_FILES['file']['tmp_name'], UPLOAD_PATH . $name))
// 使用 move_uploaded_file 函数尝试将上传的文件从临时目录移动到指定的上传路径。如果文件成功移动,则执行以下操作:
{
echo "<script>alert('上传成功')</script>";
//输出JavaScript代码,弹出一个提示框告诉用户上传成功。
echo "上传文件相对路径<br>" . UPLOAD_URL_PATH . $name;
// 输出上传文件的相对路径
} else {
echo "<script>alert('上传失败')</script>";
}
} else {
echo "<script>alert('文件类型不匹配')</script>";
}
}
第一步 上传.htaccess文件
AddType application/x-httpd-php .png //.png文件当作php文件解析
第二步 上传png的文件
第三步 进行连接
4 MIME绕过
介绍:MIME(Multipurpose Internet MailExtensions)多用途互联网邮件扩展类型。
● 是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。
● 多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
● MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。
常见的MME类型,例如:
#text表明文件是普通文本
text/plain
text/html
#image表明是某种图像或者动态图(gif)
image/jpeg
image/png
#audio表明是某种音频文件
audio/mpeg
audio/ogg
audio/*
#video表明是某种视频文件
video/mp4
#application表明是某种二进制数据
application/*
application/json
application/javascript
application/ecmascript
application/octet-stream
5.00截断
关于上传中的00截断分析 | AdminTony's Blog
0x00是字符串的结束标识符,攻击者可以利用手动添加字符串标识符的方式来将后面的内容进行截断,而后面的内容又可以帮助我们绕过检测。
数据包中必须含有上传后文件的目录情况才可以用,比如数据包中存在path: uploads/,那么攻击者可以通过修改path的值来构造paylod: uploads/aa.php%00
Q:什么是00截断?
A:信息安全中, 00截断 是针对 Web 应用程序的攻击技术。其英文名称 Null Byte 空字节,也称为空字节注入。攻击者在 URL 或文件名中插入一个空字节(ASCII码为00),用来截断文件扩展名或路径信息,达到绕过一些安全机制的目的。这种攻击方式通常是程序员开发过程中没有对输入数据进行过滤和验证。攻击者可以利用这种漏洞来执行恶意代码、窃取敏感信息等。
if (!empty($_POST['submit'])) {
$name = basename($_FILES['file']['name']);
$info = pathinfo($name);
$ext = $info['extension'];
$whitelist = array("jpg", "png", "gif");
if (in_array($ext, $whitelist)) {
$des = $_GET['road'] . "/" . rand(10, 99) . date("YmdHis") . "." . $ext;
//如果文件扩展名在白名单中,生成一个新的文件路径和名称。这里使用 $_GET['road'] 获取查询参数 'road' 的值作为目录路径,rand(10, 99) 生成一个10到99之间的随机数,date("YmdHis") 生成一个当前日期和时间的字符串,最后加上原始文件的扩展名。
if (move_uploaded_file($_FILES['file']['tmp_name'], $des))
//使用 move_uploaded_file 函数尝试将上传的文件从临时目录移动到新生成的文件路径。如果文件成功移动
{
echo "<script>alert('上传成功')</script>";
} else {
echo "<script>alert('上传失败')</script>";
}
} else {
echo "文件类型不匹配";
}
}