文件上传--题目

news2025/1/11 22:57:37

之前有在技能树中学过文件上传,正好借这次进行一个整合:

技能树中所包含的题目类型有

无限制绕过

1.上传一句话木马

  2.链接中国蚁剑

 

 

 

 

 

 前端验证

 1.会发现这个网站不让提交php,改后缀为jpg格式,再用burp抓包

 

 

 

 

2.在用中国蚁剑连接 

 .htaccess上传

1.这里先了解一下什么是.htacces文件

.htaccess文件(或者"分布式配置文件")提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。

概述来说,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

简单来说,就是我上传了一个.htaccess文件到服务器,那么服务器之后就会将特定格式的文件以php格式解析。

这里先写一个.htaaccess文件

方法一

SetHandler application/x-httpd-php //所有的文件当做php文件来解析

方法二

AddType application/x-httpd-php .png //.png文件当作php文件解析

这里使用方法二

 

这里修改名字为.htaccess。直接这个就好,不要加前缀。

 就是直接上传.htaccess,然后上传jpg文件,再用蚁剑连接,得到flag.

MIME绕过

1.先了解一下什么是MIME

MIME类型校验就是我们在上传文件到服务端的时候,服务端会对客户端也就是我们上传的文件的Content-Type类型进行检测,如果是白名单所允许的,则可以正常上传,否则上传失败。

2.开始解题,先上传一个小马,然后用bp抓包

3.这里直接修改Content-Type为image/jpeg

4.点击forward发现上传成功

5.使用蚁剑来找flag

00截断

1.这里先写两个小马,一个小马是jpg图片格式的,一个小马是php格式的。先上传jpg小马,进行抓包。

 

这里我的图片小马是222.jpg,PHP小马是111.php,将111.php写到post请求中并进行%00截断,然后进行forward

2.然后使用中国蚁剑来获得flag

双写后缀

1.这里直接上传一个php小马,进行抓包。

2.然后在文件名上写上pph,点击forward

3.然后用蚁剑来找flag
文件头检查

1.这里先用自己电脑自带的画图软件画一张画,直接上传抓包。上传后在抓的包里写入一句话木马。

这里修改后缀为php,然后在Content-type改为 image/png

2.用蚁剑连接

延伸补充

绕过后端黑名单检测

假如后端代码采用黑名单检测,那么开发人员往往会预先设置一些后缀名作为黑名单,不允许某些后缀名的文件上传,那么此时就需要去尝试各种不同的绕过方法了。
(一)换一个后缀名绕过黑名单检测

假设我们要上传的文件为php文件,那么就要去尝试,看看什么样的后缀名会被当成php文件解析。实际上,除了后缀为.php的文件会被当成php文件解析, 还有phtml php3 php4 php5之类的后缀也会,可以都去尝试一下,看看能否上传成功。
对于不同的文件,可以采用不同的后缀去测试,虽然概率很小,但万一成功了呢?
(二)用.htaccess文件巧妙绕过黑名单

假如开发者把后端代码写的很严格,甚至后缀名的大小写也写进了黑名单,那么就可以尝试用.htaccess文件来绕过了。
.htaccess全称是Hypertext Access(超文本入口)。htaccess文件也被称为分布式配置文件,是Apache特有的的针对目录改变配置的方法。通过在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。该文件可以针对不同的目录采用不同的策略。
一般后端的黑名单不会过滤把.htaccess后缀写进去,那么我们可以先上传一个.htaccess文件上去,提前设置好让它把.jpg文件当做php文件来解析,这样后续只需要上传.jpg文件就可以了。
.htaccess文件的内容如下:

AddType application/x-httpd-php .jpg

这个指令代表着.jpg文件会当做php文件来解析。
很多windows操作系统是禁止将文件名设置为空的,但是我们可以用cmd命令来实现。首先新建一个名为1.txt的文件,然后输入上述代码。接着在该文件夹下打开cmd窗口,输入:

ren 1.txt .htaccess

(三)用大小写绕过后缀名检测

对于那种老版本的WEB容器,是区分大小写的,所以这种方法只对WEB容器非常古老的版本有效。原理很简单,在解析的时候,windows的文件和文件夹都是不区分大小写的,而WEB容器区分大小写,因此上传的时候就有可能绕过该WEB容器,从而实现绕过后缀名检测。
(四)文件后缀加空格或点绕过后缀名检测

在文件名后面留一个空格,然后上传上去后空格会被自动的省略,但是看源码可知道,源码中黑名单中没有过滤空值,那么php和php空格,当然是不一样的。
注意:windows会自动去除文件末尾的空格,所以需要先上传正常的文件,然后抓包在后缀名的地方加空格,再放包,就可以了。这里的空格改成点也是一样的。
(五)构造文件后缀绕过后缀名检测

这种情况下需要对目标检测方式的源代码有一定的了解,要么了解目标网站的开发风格,要么知道源代码是如何对后缀名进行处理的,从而根据处理规则,巧妙绕过后缀名的检测。来看下面一段代码:

$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".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']);   //$_FILES['upload_file']['name']  //获取上传的文件名,比如 1.jpg
$file_name =deldot($file_name);//删除文件名末尾的点 1.jpg 
$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)) {
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
$img_path = $UPLOAD_ADDR . '/' . $file_name;
$is_upload = true;
}
} else {
            $msg = '此文件不允许上传';
        }

根据以上代码,假如输入的文件后缀名为1.php.空格.,则处理过后会剩下1.php. 在windows中,1.php.会自动变为1.php,从而实现了绕过后缀名的检测。

(六)双写绕过后缀名检测

来看一段源代码:

$file_name = str_ireplace($deny_ext,"", $file_name);

这里的意思就是把检测到的危险字符替换为空,php被替换为空,那么假设上传的文件后缀名为pphphp,被替换为空后就会变为php,从而实现了绕过。
(七)Windows文件流绕过后缀名检测

windows下硬盘格式主要有FAT16、FAT32、NTFS等。ADS(NTFS交换数据流)是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都可以存在多个数据流。通俗的理解,就是其它文件可以“寄宿”在某个文件身上,而在资源管理器中却只能看到宿主文件,找不到寄宿文件。
我们先新建一个1.txt,里面没有内容,然后在当前文件夹打开cmd,输入:

echo 123>1.txt

这表示将123写入1.txt
继续输入:

echo 123>1.txt:a.txt

这样在1.txt中没有123,并且该txt文件的大小没有变化。
那么如何访问刚才写入的文件呢?
输入:

notepad 1.txt:a.txt

就可以看见刚才输入的123
如果要显示这个文件,可以在cmd命令里输入:

dir /r

这种方式可以用来藏资料。(但是还不是最好的方法)
注意,实际上在windows中,
a.txt::$DATA就是默认不修改文件流的情况,相当于a.txt。对于windows系统而言,这两种写法没什么区别。但是对于后端的检测而言,这两种写法完全不一样。所以生成一个正常的a.txt,利用windows特性,可在后缀名中加::$DATA绕过。注意,上传成功以后,要访问时,就直接访问该文件,不要再加::$DATA
注意:只有windows可以这么操作。
 


绕过白名单检测
(一)%00截断和00截断

了解%00之前我们要先了解0x00。
00截断:类似我们用对讲机或者电报通话时,说完一句话会用over表示一句话说完了,而电脑也需要一个截断的信号,而这个信号就是00截断。
0x是一个十六进制表示方式,声明这是十六进制数,00实际上就是表示ascii码值为0,有些函数在处理这个字符的时候会把这个字符当做结束符,他们就读取到这里认为这一段结束了。
了解这个有什么用呢?
在文件上传时,如果遇到了白名单机制只允许上传jpg后缀的,我们该怎么办?JPG格式并不会被解析,那么我们需要绕过上传过滤。
假如我写了1.php%00.jpg 传参之后,有些过滤都是直接匹配字符串,他强行匹配到了结尾是.jpg,然后允许上传,但是php的函数去执行的时候他读取到0x00认为结束了,那么这个文件就变成了1.php,从而实现绕过白名单。
%00实际上和00截断是一模一样的原理,只不过%00是经过URL编码的,%00解码后就是0x00截断的那个字符。
需要注意%00和00的区别,只有GET传参会进行一次URL编码,其他的传参方式不会,所以只有GET传参能够识别这种%00的截断。

(二)绕过Content-Type检测

对于只允许指定Content-Type(内容类型)这种防护手段,最简单的绕过方法是直接上传一个允许的文件类型再抓包修改后缀名。以上传jpg文件为例,先上传该文件,抓包修改后缀名为实际的后缀名.php,由于上传的时候是jpg,所以浏览器发送的数据包中,Content-Type的类型默认为jpg,那么此时发送的文件就可以绕过后端的检测。

(三)用图片木马绕过白名单检测

实际上不一定非得把上传php文件,我们可以把木马藏在图片中,直接上传到目标服务器。假如目标存在文件解析漏洞,并且能够被我们访问到,这样木马就可以生效了。
常用的图片木马是图+马+图的形式。因为很多网站会检测头部是否是JPG 尾部是否是JPG 检测渲染是否有问题。我们就可以把一句话木马藏在中间。这种马相对而言比较难被发现。
例如,我们可以先保存一张小图片,命名为1.jpg,然后将一句话木马写到2.txt里,接着打开命令行,输入:

copy 1.jpg/b + 2.txt 3.jpg

这条命令可以把这两个文件合并,合并后显示为3.jpg。(有jpg的话需要加个/b)

(四)用gif文件绕过二次渲染

假如目标对用户上传的图片进行二次渲染,比如给图片重新截图、加水印之类的。最简单的绕过方法是直接上传gif文件去绕过(前提是目标允许上传gif格式的图片)。就是先把正常的gif图片上传上去,再下载下来,然后用文本编辑器打开,在HEX编码的页面查看都有哪些乱码变化了,一般在第四行开始可以加入一句话木马。

(五)利用条件竞争绕过白名单

条件竞争是一个需要拼运气的方法,我建议除非实在是无计可施了,不然不要采用这种方式,因此频繁访问目标网站,ip容易被ban,并且也容易引起网站管理员的注意,毕竟渗透测试讲究润物细无声,条件竞争动静有点大了,属于比较冒险的做法。接下来我讲解一下条件竞争产生的原理及如何使用条件竞争。
竞争条件发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。开发者在进行代码开发时常常倾向于认为代码会以线性的方式执行,从而忽视服务器并发执行多个线程可能带来的冲突问题,这就会导致一些意想不到的结果。
线程同步机制确保两个及以上的并发进程或线程不同时执行某些特定的程序段,该程序段也被称为临界区(critical section)。如果没有处理好临界区则可能发生“竞争条件”问题。
简单理解,两只哈士奇(线程)同时去抢一个丢出去的飞盘(资源),不知道到底哪只能抢到,此处便形成了竞争。
一般而言我们上传文件,上传了但是最后却因为过滤或者因为其他原因被删除了,那么我们可以使用条件竞争来尝试上传。我们实际上是和unlink,是和删除文件的函数进行竞争。假如我不断的上传发包,然后我同时也不断的访问那个我们上传上去的文件的地址,我们就开始和服务器的函数比手速了,函数执行都是要时间的,检测和删除也都需要时间,由于我疯狂上传,服务器来不及执行删除操作,那个时间可能很短,然后被我访问到了,就可以执行PHP命令了,那我不就比服务器手速更快了吗?

上传文件的检测流程大体上分为两种:
先检测:检测合格,然后上传(类似检票进站);
先上传:上传后再检测,把不合格的删除(类似坐公交车,先上车后买票);
检测文件是需要时间的,在检测的空档期,如果能访问到该PHP代码,就能够执行PHP指令。
所以条件竞争的核心思路是:疯狂上传php文件,然后疯狂访问这个文件,由这个php去生成另外一个文件。由于检测代码只会删除你上传的文件,并不会删除你生成的文件,所以只要生成文件成功,那么就算上传的文件被删了,也没关系,因为我们的目的已经达到了。
注意:在使用条件竞争之前,我们需要知道文件被上传到哪里去了,否则这种方法是不能用的。
代码举例:

<?php $a = '<?php @eval($_REQUEST[\'a\'])?>';
file_put_contents('1.php',$a); ?>

注意:这里面的代码要写单引号,否则会被当成代码解析,而我们要的是把字符串写入文件中。
 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python Web 开发及 Django 总结

title: Python Web 开发及 Django 总结 date: 2023-07-24 17:26:26 tags: PythonWeb categories:Python cover: https://cover.png feature: false Python 基础部分见&#xff1a;Python 基础总结 1. 创建项目 1.1 命令行 1、下载安装 Django 在终端输入 pip install djan…

SpringBoot——内置数据源

简单介绍&#xff1a; 在之前我们介绍SpringBoot的数据层解决方案的时候&#xff0c;曾说到过在数据层是由数据源&#xff0c;持久化技术和数据库组成的&#xff0c;之前我们一直使用的都是DruidMyBatisMySQL组合的解决方案。这三种方案在之前我们都介绍过如何整合以及基础的使…

Django模型将模型注释同步到数据库

1、安装django-comment-migrate库 pip install django-comment-migrate 2、将库注册到settings.py文件中 INSTALLED_APPS [...django_comment_migrate, # 表注释... ] 3、加注释 3.1、给模型&#xff08;表&#xff09;加注释 在模型的class Meta中编辑 verbose_name&…

嵌入式:QT Day2

一、继续完善登录框&#xff0c;当登陆成功时&#xff0c;关闭登陆页面&#xff0c;跳转到新的界面中 源码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug> //用于打印输出 #include <QIcon> …

部署 cacti 监控系统

Cacti Cacti&#xff08;流量和性能监测为主&#xff09; Cacti 在英文中的意思是仙人掌的意思&#xff0c;Cacti 是一套基于 PHP、MySQL、SNMP 及 RRDTool 开发的网络流量监测图形分析工具。它通过 snmpget 来获取数据&#xff0c;使用 RRDtool 绘画图形&#xff0c;而且你完…

LiveGBS流媒体平台GB/T28181常见问题-国标设备列表没有数据海康大华宇视华为监控摄像机NVR硬件设备注册不上来如何排查?

LiveGBS中国标设备列表没有数据海康大华宇视华为监控摄像机NVR硬件设备注册不上来如何排查&#xff1f; 1、国标设备列表看不到注册上来的设备2、检查方式2.1、检查设备注册信息2.2、检查服务器防火墙 3、尝试配置免密接入3.1、基础配置->白名单3.2、添加白名单 4、更多排查…

C# 目标平台为x64,自定义控件不可用,显示控件未能加载,错误解决方法

由于项目加载第三方的dll需要编译成x64&#xff0c;设置编译目标为x64 结果打开窗口设计器时&#xff0c;自定义的控件不能显示及加载 错误消息&#xff1a;未能找到类型“XXX”。请确保已引用包含此类型的程序集。如果此类型为开发项目的一部分&#xff0c;请确保已使用针对当…

ChatGPT有几个版本,哪个版本最强,如何选择适合自己的?

​ChatGPT就像内容生产界的瑞士军刀。它可以是数学导师、治疗师、职业顾问、编程助手&#xff0c;甚至是旅行指南。只要你知道如何让它做你想做的事&#xff0c;ChatGPT几乎可以提供你要的任何东西。 但重要的是&#xff0c;你知道哪个版本的ChatGPT最能满足你的需求吗&#x…

STM32CubeIDE(I2C)

目录 一、IIC轮询模式 1.1 配置 1.2 编写AHT20驱动 1.2.1 aht20.h 1.2.2 aht20.c 二、I2C中断 2.1 打开中断 2.2 分离读取流程 2.3 在主函数中重新编写读取流程 2.4 在i2c.c中重新定义stm32f1xx_hal_i2c.h中的两个函数 三、I2CDMA 3.1 配置DMA通道 3.2 代码的修改 一…

【优选算法题练习】day9

文章目录 一、DP35 【模板】二维前缀和1.题目简介2.解题思路3.代码4.运行结果 二、面试题 01.01. 判定字符是否唯一1.题目简介2.解题思路3.代码4.运行结果 三、724. 寻找数组的中心下标1.题目简介2.解题思路3.代码4.运行结果 总结 一、DP35 【模板】二维前缀和 1.题目简介 DP…

LeetCode三步问题(动态规划)

LeetCode三步问题&#xff08;动态规划&#xff09; 编写代码代码优化 链接: 三步问题 编写代码 class Solution { public:int waysToStep(int n) {if(n 1 || n 2) return n;vector<int> dp(n1);const int MOD 1e9 7;dp[0] dp[1] 1;dp[2] 2;for(int i 3;i<n…

WEB:file_include

背景知识 php伪协议 文件包含漏洞 php包含漏洞函数 题目 由题目可知这个是文件包含的题目&#xff0c;先用常用的协议先查看一下 payload ?filenamephp://filter/readconvert.base64-encode/resourceflag.php 出现了 发现filter&#xff0c;base64被过滤了 尝试其他协议 …

Elasticsearch监控工具Cerebro安装

Elasticsearch监控工具Cerebro安装 1、在windwos下的安装 1.1 下载安装包 https://github.com/lmenezes/cerebro/releases/download/v0.9.4/cerebro-0.9.4.zip 1.2 解压 1.3 修改配置文件 如果需要修改相关信息&#xff0c;编辑C:\zsxsoftware\cerebro-0.9.4\conf\applica…

c语言用冒泡排序模拟实现qsort排序

1、简单介绍冒泡排序 冒泡排序就是两两相邻元素进行比较&#xff0c;如果不满足顺序就进行交换。现有一组整数&#xff0c;将其用冒泡排序实现排序为升序。 假设有这样一组整数&#xff1a;9 8 7 6 5 由此可知&#xff0c;如果一个整型数组有num个元素&#xff0c;则需走num…

第一次作业 运维高级 MySQL备份与还原

1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) );CREATE TABLE score ( id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO…

交叉编译----宿主机x86 ubuntu 64位-目标机ARMv8 aarch64

1.交叉编译是什么&#xff0c;为什么要交叉编译 编译&#xff1a;在一个平台上生成在该平台上的可执行代码交叉编译&#xff1a;在一个平台上生成在另一个平台上的可执行代码交叉编译的例子&#xff1a;如51单片机的可执行代码&#xff08;hex文件&#xff09;是在集成环境kei…

区间预测 | MATLAB实现QRGRU门控循环单元分位数回归多输入单输出区间预测

区间预测 | MATLAB实现QRGRU门控循环单元分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRGRU门控循环单元分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 MATLAB实现QRGRU门控循环单元分位数回归分位数回归多输入单输出区间…

【Docker】安全及日志管理

目录 一、Docker 安全及日志管理1.1 Docker 容器与虚拟机的区别1. 隔离与共享2. 性能与损耗 1.2Docker 存在的安全问题1.Docker 自身漏洞2.Docker 源码问题 1.3 Docker 架构缺陷与安全机制1. 容器之间的局域网攻击2. DDoS 攻击耗尽资源3. 有漏洞的系统调用4. 共享root用户权限 …

Python in VS Code 2023年7月发布|Mypy 扩展预览版与调试扩展、Pylance 本地化及其他

排版&#xff1a;Alan Wang 我们很高兴地宣布 Visual Studio Code 的 Python 和 Jupyter 扩展将于 2023 年 7 月发布&#xff01; 此版本包括以下更新&#xff1a; Mypy 扩展预览版预览版中的调试扩展Pylance 本地化使用 Pylance 的第三方库的索引持久性即将弃用 Python 3.7 支…

新功能 – Cloud WAN:托管 WAN 服务

我很高兴地宣布&#xff0c;我们推出了 Amazon Cloud WAN&#xff0c;这是一项新的网络服务&#xff0c;它可以轻松构建和运营连接您的数据中心和分支机构以及多个 Amazon 区域中的多个 VPC 的广域网&#xff08;WAN&#xff09;。 亚马逊云科技开发者社区为开发者们提供全球的…