漏洞成因及危害
漏洞成因:网站开发时,对上传文件没有进行严格的校验,从而使攻击者绕过防御,将未允许格式的文件进行上传
漏洞危害:攻击者可以上传木马文件,实现对网站的窃取
攻击流程:
1.攻击者上传木马文件
2.访问上传的木马文件
3.getshell
实例[upload-lab]
靶场介绍:使用php编写的文件上传靶场,由作者收集CTF题型及渗透测试制成
less1:前端js脚本验证
前端代码及运行逻辑
<form enctype="multipart/form-data" method="post" onsubmit="return checkFile()">
当用户向服务器提交数据前会先执行checkfile函数
表单属性
属性/元素 | 描述 | 值/类型 |
---|---|---|
<form> | 定义表单开始和结束 | - |
enctype | 表单数据编码类型 | multipart/form-data |
method | 提交数据使用的HTTP方法 | post |
onsubmit | 提交前执行的JavaScript函数 | return checkFile() |
js代码
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() {
2.定义file变量通过[document.getElementsByName]获取页面标签中,name属性值为[upload_file]的第一个元素的值
var file = document.getElementsByName('upload_file')[0].value;
3. 判断文件内容是否为空,是,对用户进行弹窗,并返回false
if (file == null || file == "") {
alert("请选择要上传的文件!");
return false;
}
4.定义运行上传文件的后缀[类型]
var allow_ext = ".jpg|.png|.gif";
5.定义变量ext_name接收,从上传文件 file
中提取出的文件扩展名。使用 lastIndexOf(".")
方法找到文件名中最后一个点号的位置,然后使用substring提取从此位置到字符串末尾的部分。
var ext_name = file.substring(file.lastIndexOf("."));
6.使用indexof判断文件后缀名是否在允许的字符串中,如果不存在indexof返回-1条件判断为true,浏览器弹窗,并返回false。如果存在,返回ext_name在allow_ext匹配成功后,匹配的第一位索引,索引由0开始
if (allow_ext.indexOf(ext_name) == -1) {
var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
alert(errMsg);
return false;
}
绕过方法:
1.禁用浏览器js功能
google:chrome://settings/content/javascript
复制链接,粘贴进google网址栏回车进入设置页面,设置js禁用
2.bp抓包修改文件后缀
<1.将木马文件后缀修改位png,并发送
<2.bp并抓取发送的数据包
<3.修改文件后缀为原后缀
函数及方法[表]
序号 | 函数/方法 | 作用描述 | 返回值详情 |
---|---|---|---|
1 | getElementsByName | 根据元素的 name 属性获取页面上所有匹配的元素集合。 | 类数组对象,包含所有具有相同 name 属性的元素。 |
2 | [0] | 获取类似数组对象的第一个元素,通常用于访问特定元素。 | 集合中的第一个元素,类型取决于该元素(如 HTMLInputElement)。 |
3 | .value | 获取或设置表单元素的当前值,例如输入字段或文件输入字段。 | 字符串,对于文件输入字段,是用户选择的文件路径。 |
4 | if 语句 | 条件判断语句,根据条件表达式的结果来执行不同的代码块。 | 无,但它控制后续代码的执行。 |
5 | alert | 显示一个警告框,通常用于向用户显示消息或警告。 | 始终返回 true (用户点击确定后)。 |
6 | indexOf | 确定一个字符串中是否包含另一个字符串,并返回其在原字符串中首次出现的索引。 | 如果找到,返回首次出现的索引(非负整数);如果未找到,返回 -1 。 |
7 | substring | 返回一个字符串中从指定位置开始到字符串末尾的子字符串。 | 字符串,是原字符串从指定位置开始的剩余部分。 |
8 | lastIndexOf | 返回一个子字符串在父字符串中最后一次出现的位置,从右到左搜索。 | 如果找到,返回最后一次出现的索引(非负整数);如果未找到,返回 -1 。 |