文件上传漏洞&靶场通关详解

什么是文件上传漏洞?

大部分网站都拥有上传文件的部分,文件上传漏洞是由于网站开发者对用户上传文件的过滤不够严格,攻击者可以通过这些漏洞上传可执行文件(如木马,恶意脚本和WebShell等等),从而达到随意控制网站的目的。

文件上传漏洞有哪些危害?

攻击者可以通过这些漏洞上传可执行文件(如php),使服务器被控制,从而使攻击者能够植入后门程序,窃取敏感信息,侵犯用户隐私,上传恶意软件,造成数据篡改和损坏等等。

文件上传的过程?

用户发送的文件被服务器接收——>经过网站检测——>产生临时文件——>移动到指定路径

什么是WebShell?

WebShell是攻击者成功入侵网站后留下的后门程序,通常由asp,jsp和php编写。攻击者能够随时通过WebShell进入网站后端,随意查看和控制网站内容。

WebShell的分类如下:

文件上传漏洞的方法



接下来就围绕以上类型进行介绍:

前端检测

判断

直接查看:在浏览器中右键点击页面,选择 “查看源代码” 或 “检查”,打开开发者工具并切换到 “Sources” 或 “代码” 选项卡。然后搜索与文件上传相关的 JavaScript 函数,通常会有一些函数用于验证上传文件的类型、大小等属性。比如,可能会找到名为 validateFileUpload 或类似名称的函数,这很可能就是用于前端验证的函数。

查找特定关键词:使用浏览器的搜索功能(通常是快捷键 Ctrl+F 或 Command+F)在源代码中查找与文件上传验证相关的关键词,如 upload、file、validate、check 等,结合这些关键词来定位前端验证的 JavaScript 代码部分。

用浏览器开发者工具:打开浏览器的开发者工具,切换到 “Network” 选项卡,然后尝试上传一个文件。观察在文件上传过程中发起的网络请求,查看请求头和请求体中的信息。如果在请求发送之前有 JavaScript 代码对文件进行了验证,那么在请求头或请求体中可能会体现出验证的结果或相关参数。例如,可能会看到一个名为 X-File-Validated 的请求头,其值表示文件是否通过了前端验证。

借助抓包工具:除了浏览器开发者工具外,还可以使用专业的抓包工具,如 Wireshark 或 Fiddler。通过这些工具捕获文件上传时的网络数据包,分析其中的 HTTP 请求和响应,以确定是否存在前端 JavaScript 验证。如果有前端验证,通常会在请求发送之前看到一些与验证相关的 JavaScript 操作。

尝试绕过验证:选择一个不符合页面要求的文件进行上传,例如文件类型不被允许或者文件大小超过限制。如果页面只是简单地弹出一个提示框告知文件不符合要求,而没有将文件真正上传到服务器进行验证,那么很可能是使用了前端 JavaScript 进行验证。因为如果是后端验证,通常会先将文件上传到服务器,然后服务器再返回验证结果。

修改前端代码:通过浏览器开发者工具找到与文件上传验证相关的 JavaScript 代码,尝试修改其中的验证逻辑,例如将文件类型的限制条件修改为允许所有类型的文件。然后再次上传文件,如果此时文件能够成功上传,而在修改代码之前不能上传,那么就可以确定该页面使用了前端 JavaScript 验证。

绕过方法

禁用JS检测

1.F12打开开发人员选项,右上角三个点打开设置,禁用js



2.浏览器搜索url:about:config,搜索JavaScript,双击关闭

第一关

新建php文件,写入一句话木马



禁用JS后上传一句话木马,之后直接用蚁剑连接即可

还有另外一种方法第三关提到

后端检测

Content-Type检测

原理

后端通过检查HTTP请求头中的Content-Type字段来确定上传文件的类型。服务器是通过ent-type判断类型,content-type在客户端可被修改,因此可以绕过。

第二关

根据以下代码可知检测Content-Type确定文件类型



则可以上传php一句话木马,用bp抓包,修改Content-Type为代码中任意一种,即可绕过

也可以直接上传图片马,修改后缀为php,第三关会详细介绍

黑名单绕过

黑名单

文件上传黑名单‌是指在文件上传过程中,服务器明确禁止上传的文件类型列表。

第三关



分析源码可知后端将检测文件后缀类型,以上四种文件后缀不被服务器所接受,这时就可以通过上传可支持文件,之后抓包修改后缀实现绕过,如(phtml,php3,php5等等).

这里我们尝试phtml

先上传php木马,bp抓包改后缀



蚁剑连接失败

![img](https://img2023.cnblogs.com/blog/3542155/202411/3542155-20241127230318243-424320538.

检查配置文件





发现phtml被注释,打开这串代码,重启phpstudy,再次尝试,成功连接蚁剑

.htaccess绕过

htaccess定义及作用

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

通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

绕过方法

因为.htaccess文件拥有改变文件后缀的作用,因此当改文件未被禁止时,我们就可以通过上传该类文件实现改变随后上传文件后缀的目的,从而绕过黑名单。

第四关



检查源码,发现是检测后缀是否在黑名单之中,黑名单中没有.htaccess,则可以利用该漏洞入侵服务器。

先新建.htaccess文件,写入如下内容

作用是让png,txt文件也可以执行php文件功能,也可以删除这串代码中的最后.png .txt,表示将随后上传的所有文件当作php文件处理。

先上传该文件,再上传黑名单之外的一句话木马文件(如图片马).



哦吼,连接失败,查询资料才知道启用.htaccess,需要修改httpd.conf,启用AllowOverride和rewrite,将none改成all即可,rewrite模块默认开启。



再次尝试,成功连接蚁剑

.user.ini绕过

原理

.user.ini在PHP_INI_USER的配置项之中,官方解释如下



.user.ini实际上就是一个可以由用户“自定义”的php.ini,它用于覆盖或追加全局配置文件(如.php.ini)中的PHP配置选项,可以覆盖php.ini文件。

绕过

我们可以通过先上传.user.ini文件,内容如下(其中1.png为随后上传的文件名)



再上传一个图片马,包含起来进行getshell。不过前提是含有.user.ini的文件夹下需要有正常的php文件,从而导致服务器对图片文件的错误处理而导致的文件执行。

第五关

黑名单中没有.ini后缀,先上传.user.ini文件,再上传1.png

根据提示

尝试访问readme.php



成功!

蚁剑连接即可

大小写绕过

原理

有些网站没有严格过滤大小写,这时就可以利用大小写混合来绕过检测。

第六关



网页源代码没有过滤大小写,这时就可以利用大小写绕过检测。

先上传php木马文件,然后用bp抓包,修改后缀为大小写混合,用蚁剑连接即可



空格绕过

如果网站没有过滤空格时,就可以通过在检测数据后添加空格实现绕过

第七关

检测源代码,发现函数trim,其解释如下

由于本题是通过判断后缀检测文件是否能够上传,则在后缀后添加空格即可,步骤和第六关类似



蚁剑连接成功

点绕过

和空格绕过类似,这里不再详述。

第八关

NTFS交换数据流绕过

原理

window中,文件名+"::\(DATA"会把::\)DATA之后的数据当成文件流处理,不会检测后缀名,且保持"::$DATA"之前的文件名,不会检查后缀名。

第九关



源代码中没有过滤::\(DATA,和前几关步骤类似,bp抓包,改后缀,蚁剑连接
![img](https://img2023.cnblogs.com/blog/3542155/202411/3542155-20241128212256028-774043099.bmp)
不过蚁剑连接时需要删除::\)DATA

点空点绕过(. .)

原理

deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来,从而绕过检测。

第十关



当从右往左检测文件名时,会删除最后的 '.'和' '然后停止,之后得到文件名'X.php.',和之后点绕过相同。



双写后缀绕过

原理

在上传模块,有的代码会把黑名单的后缀名替换成空,例如a.php 会把php 替换成空,但是可以使用双写绕过例如 asaspp,pphphp,即可绕过上传。

第十关



其中str_ireplace函数会从左往右检测文件后缀是否在黑名单之中,若在的话,就会将其删除。

如果我们将文件后缀变成pphphp时,他只会检测到中间的php并删除,然而剩余字符依然构成php后缀,就能够实现绕过。

步骤依然一样,不再啰嗦。

%00截断绕过

原理

如果黑名单上传检测后,没有限定后缀名,绕过的方法很多,使用白名单验证会相对比较安全,因为只允许指定的文件后缀名。但是如果有可控的参数目录,也存在被绕过的风险。

保存文件时处理文件名的函数会从左往右检测,在遇到%00字符认为这是终止符,从而丢弃之后的字符。但是白名单检测时会从右往左检测,如果后面的字符符合后缀白名单要求时,就会通过检测。

第十二关



先通过白名单检测,之后从 GET 参数获取的保存路径(通过 $_GET['save_path']),

和文件后缀构成新的文件名。如果我们此时修改get请求的值,添加1.php%00



它虽然依然能后和文件后缀构成文件名,但由于遇到%00后服务器会以为已经结束,从而丢弃掉后缀名。

由于这要求php版本在5.3.4以下,因此我的靶场显示上传错误!

第十二关



这一关和上一关的区别就是本关是通过post传参保存文件的保存路径。由于post传参不会像get传参那样对%00进行url解码,因此需要手动对%00解码



在php添加一个空格,然后选中空格在右侧选中栏中将16进制数修改为00相当于‘/0’。之后用蚁剑连接即可。

文件头检测绕过

原理

所有的文件都是以二进制的形式进行存储的,在每一个文件(包括图片,视频或其他的非ASCII文件)的开头(十六进制表示)都有一片区域来显示这个文件的实际用法,这就是文件头标志,服务器对白名单进行文件头检测,符合,则允许上传,反之不允许。

主要分为三个方面:前两字节绕过,getimagesize绕过和exif_imagetype绕过。

常见文件头类型

第十四关(前两字节绕过)



关键函数fread,作用如下:



由于服务器只会检测上传文件二进制的前两个字节,所以我们可以通过修改这部分数据实现绕过。

白名单中只有jpg,png,gif这三种文件类型,这里我选择用png类型实现绕过:

先新建一个png图片,用记事本打开,并写入一句话木马



注意前面有两个空格,方便用010修改前两字节



上传该图片,而提示需要使用文件包含漏洞才能运行恶意代码



使用include包含:include.php?file=upload/文件名



成功连接

第十五关



源代码中包含了getimagesize函数



通过终端用一个正常图片和一个一句话木马生成图片马绕过检测



然后步骤和第十四关相同。

第十六关



源码使用exif_imagetype()检查文件类型是否合法



这关和第15关没有什么不同,做法是一样,但这关使用exif_imagetype()检查是否为图片文件,所以我们需要开启开启php_exif扩展,之后同第十五关

二次渲染绕过

原理

在我们上传文件后,网站会对图片进行二次处理(格式、尺寸要求等),服务器会把里面的内容进行替换更新。

处理完成后,根据原有的图片对比,找到没被修改的部分,然后利用这一部分,生成一个新的图片并放到网站对应的标签进行显示。

第十七关





源码对图片进行二次渲染



经过二次渲染,图片马中的一句话木马被删除。这是就需要在渲染前后相同部分添加一句话木马。



由于png图片渲染前后相同部分很少,一句话木马经过渲染会被删除,因此选择用gif图片插入

这时有两种方法,第一种是将渲染前后对比,在渲染前两者的相同部分插入一句话木马。

另外一种则是直接在渲染后的图片中插入一句话木马。

这里用第一种方法



保存后再次上传该图片,然后下载上传后的图片,用010打开,发现经过渲染后一句话木马仍然存在



之后利用文件包含漏洞用蚁剑连接即可

条件竞争绕过

原理



文件先上传到服务器上,然后再判断是否符合白名单,虽然非法文件在服务器中的时间很短,但仍然可以访问,可是一句话木马需要一直连接服务器才能进行操作,因此可以利用这短暂的时间执行非法文件的一句程序语句, 我们这个时候就可以使用条件竞争的方式,通过bp发送大量的上传和文件访问请求。

第十八关



先新建一个php文件并写入



上传文件到服务器,用bp抓包,发送数据包到intruder模板

上传请求:



clear清除payload



无限空发请求



将齐发线程数调大,之后是访问请求,和上传步骤相同,不过需要访问生成的文件地址,在本题中为http://127.0.0.1/upload-labs/Pass-18/index.php/shell.php

接下来开始攻击,分别点击上传请求的开始攻击按钮和文件访问的按钮。因为需要大量的请求,所以时间可能要长一点。

最后发现我们的目录下有shell.php



最后用蚁剑连接即可

Apache解析漏洞

原理

Apache解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。比如test.php.a.b的“.a”和“.b”这两种后缀是apache不可识别解析,apache就会把test.php.a.b解析成test.php。

第十九关

代码审计



这里定义了一个类,包含了一些白名单后缀。



这里是先上传文件,然后重命名文件,所以存在条件竞争。



这里对上传后的文件进行重命名。

先复制php木马,不过要利用apache解析漏洞,在后缀后可以添加.7z(只要apache不能解析就行)



与第十八关类似,通过bp发送大量的上传和文件访问请求。

上传请求完全相同,但是文件访问请求不大相同,通过查看服务器文件可知,上传文件并没有保存在upload目录下,而是保存在了upload-labs目录下。

文件访问url http://127.0.0.1/upload-labs/upload1733053426.7z

其他方式与第18关相同。

文件上传漏洞&靶场通关详解的更多相关文章

  1. 文件上传漏洞靶场分析 UPLOAD_LABS

    文件上传漏洞靶场(作者前言) 文件上传漏洞 产生原理 PASS 1) function checkFile() { var file = document.getElementsByName('upl ...

  2. 【DVWA】File Upload(文件上传漏洞)通关教程

    日期:2019-08-01 17:28:33 更新: 作者:Bay0net 介绍: 0x01. 漏洞介绍 在渗透测试过程中,能够快速获取服务器权限的一个办法. 如果开发者对上传的内容过滤的不严,那么就 ...

  3. 文件上传漏洞靶场:upload-labs安装及第一关教程

    注:本文仅供学习使用,请勿用于非法操作,后果与作者无关!!! 一.简介 upload-labs是一个使用php语言编写的,专门收集渗透测试过程中遇到的各种上传漏洞的靶场.旨在帮助大家对上传漏洞有一个全 ...

  4. 文件上传漏洞靶场:upload-labs(附在线地址)

    重装系统:CentOS 7.6 密钥对验证,或密码验证,根据自身情况选择,博主这边为了ssh连接方便选用的密码校验. WindTerm登录系统 需提前去云服务器的安全组,开放22端口ssh连接. 更新 ...

  5. PHP文件上传代码和逻辑详解

    文件上传的逐步完善------ [简单的上传:]   <form action="upload.php"  method="post"  enctype= ...

  6. JS文件上传神器bootstrap fileinput详解

    Bootstrap FileInput插件功能如此强大,完全没有理由不去使用,但是国内很少能找到本插件完整的使用方法,于是本人去其官网翻译了一下英文说明文档放在这里供英文不好的同学勉强查阅.另外附上一 ...

  7. FasfDFS整合Java实现文件上传下载功能实例详解

    https://www.jb51.net/article/120675.htm 在上篇文章给大家介绍了FastDFS安装和配置整合Nginx-1.13.3的方法,大家可以点击查看下. 今天使用Java ...

  8. 简易版php文件上传_超详细详解

    1.php简化版的图片上传(没有各种验证) 1234 <form action="" enctype="multipart/form-data" meth ...

  9. Web应用安全之文件上传漏洞详解

    什么是文件上传漏洞 文件上传漏洞是在用户上传了一个可执行的脚本文件,本通过此脚本文件获得了执行服务器端命令的功能,这种攻击方式是最为直接,最为有效的,有时候,几乎没有什么门槛,也就是任何人都可以进行这 ...

  10. PHP漏洞全解(九)-文件上传漏洞

    本文主要介绍针对PHP网站文件上传漏洞.由于文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许攻击者向某个可通过 Web 访问的目录上传任意PHP文件,并能够将这些文件传递给 P ...

随机推荐

  1. AI工具合集

    以下工具来源于互联网,可能会失效,请参考使用 网红工具 名称 链接 说明   GPT-4 https://chat.openai.com/ 需要梯子,需要付费.功能最强大的聊天机 器人. 文心一言 h ...

  2. GPT最佳实践:五分钟打造你自己的GPT

    前几天OpenAI的My GPTs栏目还是灰色的,就在今天已经开放使用了.有幸第一时间体验了一把生成自己的GPT,效果着实惊艳!!!我打造的GPT模型我会放到文章末尾,大家感兴趣也可以自己体验一下. ...

  3. C++ STL stack容器——栈

    stack容器 基本概念 stack是一种先进后出的数据结构,它只有一个出口,形式如下图所示.stack容器允许新增元素,移除元素,取得栈顶元素,但是除了最顶端外,没有任何地方可以存取stack的娶她 ...

  4. CSP-S 2023

    T1 直接 \(10^{5}\) 枚举状态就过了,合法的非零差分数量只可能为 \(1,2\)(\(0\) 相当于没转,按照题意 "都不是正确密码" 是不符的) 需要注意的是形如 0 ...

  5. 【赵渝强老师】管理Docker镜像

    一.什么是Docker的镜像 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙 ...

  6. Nodejs C++插件(N-API)

    Nodejs C++插件(N-API) 0. 环境搭建 1. JS中调用C++方法 1.1 JS中调用源文件的C++方法 1.2 JS中调用动态库的C++方法 2. C++中调用JS方法 2.1. C ...

  7. 墨天轮国产数据库沙龙 | 四维纵横姚延栋 :MatrixDB,All-in-One高性能时序数据库

    分享嘉宾:姚延栋 北京四维纵横数据有限公司创始人.原Greenplum 北京研发中心总经理.Greenplum中国开源社区创始人.PostgreSQL中文社区常委.壹零贰肆数字基金会(非营利组织)联合 ...

  8. iOS通知使用小结

    最近在项目开发中遇到了一个问题,首页底部菜单和底部子菜单的互动.需求是这样的,编辑状态下点击红色删除按钮,首页底部菜单移除该项,子菜单中对应项选中状态设置为未选中,典型的一对多方式.刚开始的方案是想通 ...

  9. axios 常见状态码

    '100': 'Continue', '101': 'SwitchingProtocols', '102': 'Processing', '103': 'EarlyHints', '200': 'Ok ...

  10. 013 Python 变量的内存管理(学点底层东西显得你异于常人)

    #!/usr/bin/env python # -*- coding:utf-8 -*- # Datatime:2022/7/18 21:13 # Filename:011 Python约定俗称的常量 ...