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

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

什么是文件上传漏洞?

大部分网站都拥有上传文件的部分,文件上传漏洞是由于网站开发者对用户上传文件的过滤不够严格,攻击者可以通过这些漏洞上传可执行文件(如木马,恶意脚本和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关相同。

相关推荐
Lspecialnx_2 小时前
文件解析漏洞中间件(iis和Apache)
网络安全·中间件
学习溢出4 小时前
【网络安全】逆向工程 练习示例
网络·安全·网络安全·渗透测试·逆向工程
孤独的履行者7 小时前
入门靶机:DC-1的渗透测试
数据库·python·网络安全
Blankspace学8 小时前
Wireshark软件下载安装及基础
网络·学习·测试工具·网络安全·wireshark
CVE-柠檬i11 小时前
Yakit靶场-高级前端加解密与验签实战-全关卡通关教程
网络安全
轨迹H1 天前
kali设置中文输入法
linux·网络安全·渗透测试·kali
cr.sheeper1 天前
Vulnhub靶场Apache解析漏洞
网络安全·apache
Autumn.h1 天前
文件解析漏洞
web安全·网络安全·中间件
Mitch3111 天前
【漏洞复现】CVE-2023-37461 Arbitrary File Writing
web安全·网络安全·prometheus·metersphere·漏洞复现