文件上传--题目
之前有在技能树中学过文件上传,正好借这次进行一个整合:
技能树中所包含的题目类型有
无限制绕过
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); ?>
注意:这里面的代码要写单引号,否则会被当成代码解析,而我们要的是把字符串写入文件中。
相关文章:

文件上传--题目
之前有在技能树中学过文件上传,正好借这次进行一个整合: 技能树中所包含的题目类型有 无限制绕过 1.上传一句话木马 2.链接中国蚁剑 前端验证 1.会发现这个网站不让提交php,改后缀为jpg格式,再用burp抓包 2.在用中国蚁剑连接 .…...

小程序创建
1,下载HBuilder X ;(3.8.7) HBuilderX-高效极客技巧 2,下载模板(不选云服务的); 3,运行-运行到小程序模拟器; 4,安装小程序开发工具; 5,选择稳定版-windows64版&…...

stable diffusion如何确保每张图的面部一致?
可以使用roop插件,确定好脸部图片后,使用roop固定,然后生成的所有图片都使用同一张脸。 这款插件的功能简单粗暴:一键换脸。 如图所示: 任意上传一张脸部清晰的图片,点击启用。 在其他提示词不变的情况下…...

保存Windows锁屏壁纸
原链接 1. 点击爱心 我保存过了,所以没有爱心了. 2. 打开本地文件夹 用户改成自己的 C:\Users\86186\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets 3. 复制这些文件到其他目录 我这个不知道咋的,操作完文件夹过1会就被…...

面向对象编程:深入理解内部类与抽象类的使用
文章目录 一、内部类使用:1.1 成员内部类:1.1.1 成员内部类的主要特点是: 1.2 局部内部类:1.2.1 局部内部类的主要特点是:1.2.2 局部内部类通常用于以下情况: 1.3 静态内部类:1.3.1 静态内部类的…...

linux安装oracle
oracle安装 基于linux系统安装 Linux安装oracle12C Centos7.6 内存8GB 硬盘:50GB 可视化图形界面 yum groupinstall "GNOME Desktop" -y 可视化后续安装命令 1、软件环境包安装 yum -y install binutils compat-libcap1 compat-libstdc-33 gcc-c glib…...

切面 基于Aspect注解自动切面, 省下注解判断逻辑 handler
父文章 spring aop 切面配置_aop 切面设置.**_个人渣记录仅为自己搜索用的博客-CSDN博客 【Spring AOP】Aspect结合案例详解(一): Pointcut使用annotation 五种通知Advice注解(已附源码)_pointcut annotation_天罡gg的博客-CSDN博…...

golang,gin框架的请求参数(一)--推荐
golang,gin框架的请求参数(一) gin框架的重要性不过多的强调,重点就gin使用中的参数传递,获取进行梳理文件,满足使用需求。 获取前端请求参数的几种方法: 一、获取参数【浏览器地址获取参数】…...

ardupilot 遥控的输入控制模式
目录 本节主要记录自己整理ardupilot的遥控器的输入控制模式:正常模式、简单模式、超简单模式的理解。 1.正常模式(有头模式) 在不用简单和超简单的模式的情况下,无人机操作员操作的控制输入是对应着不断旋转着的飞行器进行操作的。如上方图所示举例,当无人机操作员进行…...

Unity UGUI的StandaloneInputModule (标准输入模块)组件的介绍及使用
Unity UGUI的StandaloneInputModule (标准输入模块)组件的介绍及使用 1. 什么是StandaloneInputModule组件? StandaloneInputModule是Unity UGUI系统中的一个标准输入模块组件,用于处理鼠标和键盘的输入事件。它可以将鼠标和键盘的输入转化为UGUI系统中…...

惠普HP Color Laser 150a开机红色感叹号闪烁不打印故障解决方法
故障描述: 惠普HP Color Laser 150a开机红色感叹号闪烁,不能打印,电脑提示C3-6140。 检测分析: 在解决C3-6140错误代码之前,我们需要先检查打印机是否连接正常。如果打印机连接不正常,也可能会出现这个错误…...

CVE-2023-1454注入分析复现
简介 JeecgBoot的代码生成器是一种可以帮助开发者快速构建企业级应用的工具,它可以通过一键生成前后端代码,无需写任何代码,让开发者更多关注业务逻辑。 影响版本 Jeecg-Boot<3.5.1 环境搭建 idea 后端源码: https://git…...

MFC使用png做背景图片
在MFC中使用png图片作为背景,你需要使用GDI库。以下是一个简单的示例: 首先,你需要在你的项目中包含GDI头文件和库。在你的stdafx.h(或者你的项目预编译头文件)中添加以下代码: #include <GdiPlus.h&g…...

Java开发的基石:JDK
Java开发的基石:JDK 前言一、引入二、JDK的发展历程三、JDK主要目录结构解析四、JDK的使用 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快&…...

使用langchain与你自己的数据对话(三):检索(Retrieval)
之前我已经完成了使用langchain与你自己的数据对话的前两篇博客,还没有阅读这两篇博客的朋友可以先阅读一下: 使用langchain与你自己的数据对话(一):文档加载与切割使用langchain与你自己的数据对话(二):向量存储与嵌入 今天我们…...

DEVICENET转ETHERNET/IP网关devicenet协议
捷米JM-EIP-DNT,你听说过吗?这是一款自主研发的ETHERNET/IP从站功能的通讯网关,它能够连接DEVICENET总线和ETHERNET/IP网络,从而解决生产管理系统中协议不同造成的数据交换互通问题。 这款产品在工业自动化领域可谓是一大利器&…...

GPT一键化身「AI助理」——自定义指令功能
最近GPT又更新了一个超实用的功能——自定义指令,启用后,你可以给GPT设置一些固定指令,让它记住或扮演某个角色,比如客服、律师、投资管理师、老师、营养师...... 这样,我们就不再需要每次都要打开新的聊天,…...

深入理解Promise
原文合集地址如下,有需要的朋友可以关注 本文地址 合集地址 什么是Promise 当谈论 Promise 时,可以将其比喻为一种承诺或契约,用于处理异步操作的结果。异步操作是指那些不会立即完成的操作,比如从服务器获取数据、读取文件、发送网络请求等等。通常情况下,这些操作需…...

【2023 年第二届钉钉杯大学生大数据挑战赛】 初赛 B:美国纽约公共自行车使用量预测分析 问题三时间序列预测Python代码分析
2023 年第二届钉钉杯大学生大数据挑战赛 初赛 B:美国纽约公共自行车使用量预测分析 问题三时间序列预测Python代码分析 相关链接 【2023 年第二届钉钉杯大学生大数据挑战赛】 初赛 B:美国纽约公共自行车使用量预测分析 问题一Python代码分析 【2023 年…...

redis-cluster 创建及监控
集群命令 cluster info:打印集群的信息。 cluster nodes:列出集群当前已知的所有节点(node)的相关信息。 cluster meet <ip> <port>:将ip和port所指定的节点添加到集群当中。 cluster addslots <slot…...

vue+ivew model框 select校验遇到的问题
iview model 点击关闭,校验没有通过也会关闭 解决办法: 第一步:自定义页脚内容 <div slot"footer"><Button type"primary" click"confirmCarryOver()">确认</Button><Button click&qu…...

mybatis_分页
目的: 减少数据处理量,提高效率 普通sql: 语法:select * from user limit startIndex,pageSize; SELECT * from user limit 3; #[0,n] mybatis_sql: 接口: //分页查询List<User> getUserByLimit(Map<…...

轻量级Firefox Send替代方案Gokapi
想不到一个域名的变动会影响这么大,访问量出现断崖式下跌。由此可见,平时的访问应该只是一些 RSS 的访问而已。 上面是 Pageviews,下面是 Uniques 今天略有回升 难怪那些大公司要花钱买域名了,不过老苏是个佛系的人,一…...

多次发请求优化为发一次请求
优化 getUserInfo 请求 要求 getUserInfo 是个通用接口,在各个模块里面都有可能使用 requestUserInfo 模拟的是请求服务端真正获取用户信息的方法 业务背景 在一个页面有 A, B, C 等多个功能模块,A, B, C 模块渲染执行顺序不可控每个模块都会调用 get…...

彻底搞懂CPU的特权等级
x86 处理器中,提供了4个特权级别:0,1,2,3。数字越小,特权级别越高! 一般来说,操作系统是的重要性、可靠性是最高的,需要运行在 0 特权级; 应用程序工作在最上层,来源广泛、可靠性最低,工作在 3 特权级别。 中间的1 和 2 两个特权级别,一般很少使用。 理论上来讲,…...

JVM对象在堆内存中是否如何分配?
1:指针碰撞:内存规整的情况下 2:空闲列表: 内存不规整的情况下 选择那种分配方式 是有 java堆是否规整而决定的。而java堆是否规整是否对应的垃圾回收器是否带有空间压缩整理的能力决定的。 因此当使用Serial,ParNew等带有压缩整理过程的收…...

【小白慎入】还在手动撸浏览器?教你一招分分钟自动化操作浏览器(Python进阶)
大家好啊,辣条哥又来猛货了! 小白慎入! 目录 环境安装1 测试样例2 基本配置2.0 基本参数2.1 设置窗口2.2 添加头部2.3 网页截图2.4 伪装浏览器 绕过检测2.5案例演示 触发JS2.6 boss直聘cookie反爬绕过实践2. 7滚动到页面底部 3 进阶使用4 数…...

Unity UGUI的TouchInputModule (触摸输入模块)组件的介绍及使用
Unity UGUI的TouchInputModule (触摸输入模块)组件的介绍及使用 1. 什么是TouchInputModule组件? TouchInputModule是Unity中的一个UGUI组件,用于处理触摸输入事件。它可以让你的游戏在移动设备上实现触摸操作,如点击、滑动、缩放等。 2. …...

SpringMVC启动时非常缓慢,显示一直在部署中,网页也无法访问,,,Artifact is being deployed, please wait...
写了一个基本的SpringMVC程序进行测试,结果启动时一直显示在等待部署完毕,,, but这个地方一直显示转圈圈。。 后来通过url访问时网页一直转圈圈。。也就是等待响应。。 看了一会儿,也不知道哪儿错了,&…...

Docker 镜像操作
Docker镜像操作 我们已经介绍了容器操作,今天来了解下 Docker镜像 以及 镜像操作 。让我们一起开启镜像之旅吧。 Docker镜像 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库…...