文件上传漏洞 --- php邂逅windows通用上传缺陷

news/2024/5/18 23:57:26/文章来源:https://blog.csdn.net/m0_63069714/article/details/130089675

目录

后端源码

前端源码

后端代码审计

方式一绕过原理 --- 冒号加特性

验证及结果

方式二绕过原理 --- 数据流

验证及结果


环境需求

php5.2.17+IIS环境,可以下载phpstuday2018来满足环境的要求。

后端源码

<?php
//U-Mail demo ...
if(isset($_POST['submit'])){$filename = $_POST['filename'];$filename = preg_replace("/[^\w]/i", "", $filename);$upfile = $_FILES['file']['name'];$upfile = str_replace(';',"",$upfile);$upfile = preg_replace("/[^(\w|\:|\$|\.|\<|\>)]/i", "", $upfile);$tempfile = $_FILES['file']['tmp_name'];$ext = trim(get_extension($upfile)); // nullif(in_array($ext,array('php','php3','php5'))){die('Warning ! File type error..');}if($ext == 'asp' or $ext == 'asa' or $ext == 'cer' or $ext == 'cdx' or $ext == 'aspx' or $ext == 'htaccess') $ext = 'file';//$savefile = 'upload/'.$upfile;$savefile = 'upload/'.$filename.".".$ext;if(move_uploaded_file($tempfile,$savefile)){die('Success upload..path :'.$savefile);}else{die('Upload failed..');}
}
function get_extension($file){return strtolower(substr($file, strrpos($file, '.')+1));
}
?>

前端源码

<html><body><form method="post" action="upfile.php" enctype="multipart/form-data"><input type="file" name="file" value=""/><input type="hidden" name="filename" value="file"/><input type="submit" name="submit" value="upload"/></form></body>
</html>

后端代码审计

首先是post获取到的是name属性为filename的标签,而为filename属性的标签的值为file ,由于前端可以修改这个值,因此对这个值进行下面的正则过滤;

对name为filename且用户可以修改该值进行了过滤,将非a-z、A-Z、0-9、下划线的字符替换为空;

获取上传文件的文件名;

如果文件类型后的存在";",将其替换成空;

对文件类型将非a-z、A-Z、0-9、下划线、:、$、.、<、>的字符替换为空;

获取文件的临时文件名;

去除文件首尾的空格并且获取文件的后缀名;

判断文件后缀名是否是"php","php3","php5",如果是的话,直接程序结束;

判断文件类型是否是"asp"、"asa"、"cer"、"cdx"、"aspx"、"htaccess";

定义文件上传的路径;

通过move函数将临时文件进行覆盖到用户定义好的路径。

解这道题我们就得先了解下系统特性对文件上传的知识点了

这几行英文的意思大致是在,php+windows+iis环境下:

双引号("“") <==> 点号(".");

大于符号(">") <==> 问号("?");

小于符号("<") <==> 星号("*");

通过一系列的测试发现,该特性只能用于文件上传时覆盖已知的文件,于是这个特性便略显得鸡肋

经过反复的寻找资料,终于不负有心人,找到了解决方案

思路如下:

首先我们先利用特殊办法生成一个php文件,然后再利用这个特性将文件覆盖。

可是问题来了,怎样生成php文件呢?如果可以直接生成php文件的话,干嘛还要利用那什么特性;

我们都知道,在文件上传时,我们往往会考虑到文件名截断,如%00等

对!有的人可能还会用冒号":"去截断,如bypass.php:jpg

但是存在一个问题,冒号截断产生的文件是空白的,里面并不会有任何的内容,此时应该明白了吧。虽然生成的php文件里面没有内容,但是php文件总生成了吧。上面不是说到,系统那种特性有点鸡肋,但是刚好用到现在。这不就完美的利用。

方式一绕过原理 --- 冒号加特性

首先通过冒号(":")进行截断,此时已经将xxx.php文件上传上去了,只不过是此时的php文件是空白的,里面没有任何内容。而在通过xxx.<<<的方式来匹配之前上传的xxx.php文件进行覆盖,为什么xxx.<<<可以匹配到xxx.php文件呢?原因上面已经说到过,在php+windows+iis的系统特性下,存在小于符号("<")等于星号("*"),而星号("*")在通配符中代表着可以匹配任意字符,此时通过三个小于号("<<<")则能满足匹配到php这个后缀。因此第二次上传通过xxx.<<<来匹配第一次已经上传的xxx.php来进行文件的覆盖,此时完成了绕过。有人就会说那xxx.<<<这种方式的后缀名,不会被过滤掉吗?在判断文件后缀的过滤中是放行小于号("<")的,因此xxx.<<<是可以上传的。

验证及结果

抓包后未修改

 

第一次使用冒号(":")进行截断,使得php文件上传上去,此时的文件是空文件

 此时查看上传文件,文件是成功上传但是是空文件

第二次根据特性使用小于号("<<<")来匹配已经传上去的php后缀名文件,将其覆盖掉

 查看上传文件,此时文件中已经有内容,代表成功将其覆盖掉了

最后在做一次验证,我们可以看到php文件成功上传且得到解析

 

方式二绕过原理 --- 数据流

特性二

我们来看看MSDN上面的一段话,如图

 注意红色圈起来的英文

The default data stream has no name. That is, the fully qualified name for the default stream for a file called "sample.txt" is "sample.txt::$DATA" since "sample.txt" is the name of the file and "$DATA" is the stream type.

 

验证及结果

 

给文件的后缀添加数据流

 

查看文件上传

 

可以看到文件成功上传,且php文件也得到解析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_285688.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目3:积分等级表接口的开发和使用(后台)

项目3&#xff1a;积分等级表接口的开发和使用 1.service-core的controller创建admin包 2.对积分登记表完成增删改查 3.配置swagger接口生成器和ui 4.统一设置返回结果 5.统一设置异常处理 6.统一日志处理 项目3&#xff1a;积分等级表接口的开发和使用 1.service-core的…

编码与加密基础笔记

文章目录&#x1f449;1、ASCII 编码&#x1f449;2、了解Base64&#x1f449;3、MD5消息摘要算法&#x1f449;4、对称加密与 AES&#x1f449;5、非对称加密与 RSA参考书籍《Python 3 反爬虫原理与绕过实战》&#x1f449;1、ASCII 编码 ASCII编码实际上约定了字符串和二进制…

unity的基本窗口界面简要介绍

呜呜呜呜呜呜呜呜呜&#xff0c;怎么可能不难过啊&#xff0c;这tm比失恋难受 学习学习&#xff0c;我要移情别恋 打开一个项目&#xff0c;在左上角或者其他地方&#xff0c;能看到以下界面 Scene&#xff1a;场景编辑窗口 在这个界面我们可以自由切换视角观看场景&#xff0…

Web前端基础——盒子模型

&#xff08;1&#xff09;盒子模型的作用&#xff1a; 布局网页&#xff0c;摆放盒子和内容 &#xff08;2&#xff09;盒子模型重要组成部分&#xff1a; 内容区域 - width & height内边框 - padding&#xff08;出现在内容与盒子边缘之间&#xff09;边框线 - border外…

MySQL---数据类型

文章目录前言一、数据类型分类二、数值类型1.tinyint类型2.bit类型三、小数类型1.float2. decimal三、字符串类型1.char2.varchar3.char和varchar比较四、日期和时间类型五、enum和set我们如何找到性别是男或者女呢?我们如何找到爱好有rapper呢?总结前言 正文开始!!! 一、数…

NE555 Motor LED Chaser

文章目录1.前言2.资料下载1.前言 这个是从YouTube上搬运来的&#xff0c;如图所示 2.资料下载 所需材料 #1# 10k resistor 1 #2# 10k variable resistor 1 #3# 10uf capacitor 1 #4# 3mm blue led 4 #5# 3mm yellow led 4 #6# 3mm red led 4 #7# 3mm green led 4 #8# 3mm w…

新规拉开中国生成式AI“百团大战”序幕?

AI将走向何方&#xff1f; ChatGPT在全球范围掀起的AI热潮正在引发越来越多的讨论&#xff0c;AI该如何管理&#xff1f;AI该如何发展&#xff1f;一系列问题都成为人们热议的焦点。此前&#xff0c;马斯克等海外名人就在网络上呼吁OpenAI暂停ChatGPT的模型训练和迭代&#xf…

OpenCV实战之人脸美颜美型(六)——磨皮

1.需求分析 有个词叫做“肤若凝脂”,直译为皮肤像凝固的油脂,形容皮肤洁白且光润,这是对美女的一种通用评价。实际生活中我们的皮肤多少会有一些毛孔、斑点等表现,在观感上与上述的“光润感”相反,因此磨皮也成为美颜算法中的一项基础且重要的功能。让皮肤变得更加光润,就…

记录一次使用宝塔部署Vue3 + Spring boot项目遇到的问题

一. Vue相关配置 1. 修改Vue配置文件&#xff1a;&#xff08;vue.config.js&#xff09;,没有该文件则在项目根目录下新建 const { defineConfig } require(vue/cli-service)module.exports defineConfig({transpileDependencies: true,assetsDir: assets, // 静态资源保存…

C. Pinkie Pie Eats Patty-cakes(二分)

Problem - C - Codeforces 小粉饼买了一袋不同馅料的馅饼饼!但并不是所有的馅饼饼在馅料上都各不相同。换句话说&#xff0c;这个袋子里有一些馅料相同的馅饼。小粉派一个接一个地吃蛋糕。她喜欢玩&#xff0c;所以她决定不只是吃馅饼蛋糕&#xff0c;而是尽量不经常吃同样馅料…

[Django] 后台管理系统

浏览之前&#xff0c;请先阅读以下文章 1.Django项目创建 2.Django路由系统 在项目目录下的urls.py文件中&#xff0c;我们会看到这样一个url的配置 启动服务&#xff0c;在浏览器中输入网址http://127.0.0.1:8000/admin/&#xff0c;结果如下 Django提供了一个非常强大的管…

“绿菜单”2.0发布 数据中心液冷生态建设进入加速期

近年来&#xff0c;随着数字化社会对算力需求的不断增长&#xff0c;数据中心能耗与散热问题日益凸显。液冷作为更加高效、低能耗的制冷技术&#xff0c;逐渐成为了数据中心建设的热门选择。对此&#xff0c;产业上下游企业热情高涨&#xff0c;液冷产品与方案纷纷亮相&#xf…

【JSON学习笔记】3.JSON.parse()及JSON.stringify()

前言 本章介绍JSON.parse()及JSON.stringify()。 JSON.parse() JSON 通常用于与服务端交换数据。 在接收服务器数据时一般是字符串。 我们可以使用 JSON.parse() 方法将数据转换为 JavaScript 对象。 语法 JSON.parse(text[, reviver])参数说明&#xff1a; text:必需&…

hadoop单机版安装

文章目录1. 将安装包hadoop-3.1.3.tar.gz上次至linux中2. 进行解压操作3. 修改目录名称4. 配置环境变量5. 使用官方提供的jar包实现wordcount案例1. 将安装包hadoop-3.1.3.tar.gz上次至linux中 2. 进行解压操作 tar -zxvf hadoop-3.1.3.tar.gz -C /opt/softs/##tar: 解压打包的…

Prophet学习(一) Python API实现

目录 Python API 详细介绍 完整代码&#xff1a; Python API 详细介绍 Prophet遵循sklearn模型API。我们创建Prophet类的实例&#xff0c;然后调用它的fit和predict方法。 Prophet的输入总是一个有两列的数据帧:ds和y。ds(日期戳)列应该是Pandas期望的格式&#xff0c;理想…

自动内存管理之【常量池】

首先上一段代码&#xff0c;一起思考&#xff0c;打印的结果&#xff0c;基于jdk1.8。 StringBuilder sbnew StringBuilder("我爱我媳妇儿");String s sb.toString();System.out.println(s.intern()s); //falsesb.append("&#xff0c;她也很爱我&#xff01;&…

MyBatis 批量插入的正确姿势

近日,项目中有一个耗时较长的Job存在CPU占用过高的问题,经排查发现,主要时间消耗在往MyBatis中批量插入数据。mapper configuration是用foreach循环做的,差不多是这样。 这个方法提升批量插入速度的原理是,将传统的: INSERT INTO `table1` (`field1`, `field2`) VALUES …

【Java数据结构】链表OJ提交小记

目录 1.删除链表中所有值为val的节点 2.反转单链表 3.返回链表的中间节点 4.返回链表倒数第k个节点 5.按次序合并链表 6.按值分割链表 7.判断链表是否为回文 1.删除链表中所有值为val的节点 1. 删除链表中所有值为val的节点https://leetcode.cn/problems/remove…

Docker开启远程访问

一、修改配置文件 #修改配置文件 vim /etc/systemd/system/multi-user.target.wants/docker.service # 增加-H tcp://0.0.0.0[Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target docker.socket firewa…

【华为OD机试】1026 - 字符串合并处理

文章目录一、题目&#x1f538;题目描述&#x1f538;输入输出&#x1f538;样例1&#x1f538;样例2&#x1f538;样例3二、代码参考作者&#xff1a;KJ.JK&#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308;…