pikachu靶场通关教程(七)——任意文件下载与上传

发布于 2024-03-24  312 次阅读


一、介绍

因为这两关内容较少,而且比较相关,就放到一起来讲。

任意文件下载:有时网站会提供文件下载的功能,常常由前端的参数传入一个文件名,但如果开发时未对传入的参数进行限制,攻击者就可以通过构造路径,下载当前文件夹甚至服务器下的任意文件。

任意文件上传:网站常需要支持用户上传各种文件,如图片、视频等。然而,如果没有对用户上传的文件的名称、格式等进行合适的限制,就可能会使得攻击者可以上传木马等恶意文件,导致安全风险。

二、任意文件下载

根据提示,点击一个图片就可以下载对应的图片,本质上是打开了一个下载链接。可以通过将鼠标放在对应的标题上或者在下载页面查看到

这个链接通过参数filename传入了图片名称,然后下载了对应的图片,那么我们构造一个路径,尝试下载上级目录中文件,这里我提前放置了一个目标文件用于演示。

http://192.168.52.131:800/vul/unsafedownload/execdownload.php?filename=../../../miku.png

可以看到成功下载了上级目录中的文件,因此可以通过这个漏洞将整个服务器爬下来。

三、任意文件上传

有文件上传功能的地方,通常会对上传的文件进行检测,一般是对用户的请求包的各个HTTP头或data内容进行检查,靶场中就提出了三种常见的检测方法。

1.前端验证

还记得么?曾经有说过,一切前端的验证都不算验证。

正常地上传一个php文件是不允许的。

根据关卡名称的提示,我们打开F12查看当前页面的代码,寻找JS的踪迹,果然找到了对应的逻辑。

直接禁用JS(浏览器设置直接搜JavaScript),就能够成功上传了。

2.MIME验证

首先要了解一下什么是MIME头,它是描述消息内容类型的标准,用来表示文档、文件或字节流的性质和格式的HTTP头,主要的部分是Content-Type,但还有Mime-Version、Content-Transfer-Encoding、Content-ID、Content-Description、Content-Disposition、boundary这些,但我们常见的一般是Content-Type,这里的验证也是对它的验证。简单来说就是表示你上传的文件是什么格式的,而Content-Type都是“主类型/子类型”的形式,可以自行搜索了解一下。

那么首先上传php,然后抓包。

可以看到Content-Type的内容为application/octet-stream,在重放器中发出这个包,可以看到被服务器拦截了。

那么我们将Content-Type改为image/jpeg,就可以成功上传。

3.getimagesize验证

getimagesize(),是PHP中用于获取图像的大小和格式的函数。它可以返回一个包含图像的宽度、高度、类型和MIME类型的数组。如果当前上传的不是图像,就可以通过这个函数检测出来。然而我们可以在文件前加上GIF89a或合并上一个图片文件作为图片马进行绕过,这样该函数就会认为我们上传的是一个gif文件。接下来实践一下,直接上传。

提示我们后缀名不能为空,看来是.php被服务器过滤掉了。这里要用到一种叫00截断的方法,原理就是识别到%00时就会认为已经结束,但是服务器比对文件名的时候还是会比较后面的内容。

filename = "1.php%00.jpg"

在判断后缀名的时候,会从后进行判断,识别到.jpg的时候,就会认为格式正确并放行。但当给上传的路径赋值时,当识别到1.php%00的时候,就会认为字符串已经结束,于是就完成了绕过。

于是我们就绕过了第一关,那么根据提示,服务器识别出了这不是一张图片,可以尝试在文件首部加上GIF89a,同时修改Content-Type进行绕过。

至此就完成了一次相对严谨(?)的验证绕过。

四、修复方法

1.任意文件下载

过滤敏感字符:如“../”等非常常见的敏感字符,使得用户无法进入上级目录。

独立下载区域:将可下载文件与功能性文件分开,仅该文件夹内文件可供下载,其它文件夹应通过配置禁止下载行为。

参数编码:如果有涉及到传入参数的,要使用合适的方式对参数进行编码,使得用户无法得知参数与下载内容之间的关系。

限制文件访问范围:在配置文件中限定可访问的文件范围,防止意外的信息泄露。

及时更新服务版本:及时关注漏洞情报,修复漏洞插件。

生成下载日志:留日志是好习惯。

2.任意文件上传

严格限制文件上传类型:绝对不能只有前端限制,应该前后端都做限制。应对文件后缀、Content-Type进行严格检验,最好使用白名单进行限制。

重命名文件:对用户上传的文件进行重命名,该命名不应该有易看出规则的命名方法。

检查文件内容:对文件内容进行检测,如发现危险字符,应该终止上传行为。

限制上传文件大小:防止恶意的垃圾数据填充攻击。

独立上传区域:将上传文件的路径与功能区域分开,并严格限制该文件夹权限,禁止该文件夹执行文件。

使用OSS云对象存储:时代在变化,小子!一种仅供存储文件无法执行的云服务,可以了解一下。

五、后记

最后提到的OSS是云时代带来的一种新型的解决方式,基本上可以杜绝上传恶意文件的攻击行为,因为上传的文件根本就无法执行。但同样的也会带来新的安全问题,如密钥泄露,API泄露等,这些都需要养成良好的代码习惯才能杜绝。