文件上传漏洞:成因,危害,实例[upload-lab_less1源码分析]

漏洞成因及危害

漏洞成因:网站开发时,对上传文件没有进行严格的校验,从而使攻击者绕过防御,将未允许格式的文件进行上传

漏洞危害:攻击者可以上传木马文件,实现对网站的窃取

攻击流程:

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.修改文件后缀为原后缀

                                                                                  函数及方法[表]

序号函数/方法作用描述返回值详情
1getElementsByName根据元素的 name 属性获取页面上所有匹配的元素集合。类数组对象,包含所有具有相同 name 属性的元素。
2[0]获取类似数组对象的第一个元素,通常用于访问特定元素。集合中的第一个元素,类型取决于该元素(如 HTMLInputElement)。
3.value获取或设置表单元素的当前值,例如输入字段或文件输入字段。字符串,对于文件输入字段,是用户选择的文件路径。
4if 语句条件判断语句,根据条件表达式的结果来执行不同的代码块。无,但它控制后续代码的执行。
5alert显示一个警告框,通常用于向用户显示消息或警告。始终返回 true(用户点击确定后)。
6indexOf确定一个字符串中是否包含另一个字符串,并返回其在原字符串中首次出现的索引。如果找到,返回首次出现的索引(非负整数);如果未找到,返回 -1
7substring返回一个字符串中从指定位置开始到字符串末尾的子字符串。字符串,是原字符串从指定位置开始的剩余部分。
8lastIndexOf返回一个子字符串在父字符串中最后一次出现的位置,从右到左搜索。如果找到,返回最后一次出现的索引(非负整数);如果未找到,返回 -1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值