不安全的文件下载和上传

不安全的文件下载和上传

一、文件下载漏洞

相信大家都见过,很多网站都提供文件下载功能,即用户可以通过点击下载链接,下载到链接所对应的文件。

但是,如果文件下载功能设计不当,则可能导致攻击者可以通过构造文件路径,从而获取到后台服务器上的其他的敏感文件。(又称:任意文件下载)

1、靶场测试

随便打开一个连接就可下载图片:

image-20210214141302709

如下图所示,这是请求下载的url:

如图所示,该请求是get方式通过url传入文件名下载的

image-20210214141734696

于是尝试更改传参内容:../../../../../../../../etc/passwd从网页当前目录跳转到/etc/passwd然后下载passwd文件

提交payload 成功下载passwd文件
image-20210214142327352 image-20210214142448241image-20210214142606996

payload2: ../../../../../../../etc/fstab

提交payload 成功下载fstab文件
image-20210214143105421 image-20210214143129006image-20210214143217134

说明该网页存在任意文件下载漏洞。

源码分析:----------------------------------execdownload.php

image-20210214152149270

2、防范措施

  • 对传入的文件名进行严格的过滤和限定(白名单限制或过滤敏感字符)。
  • 对文件下载的目录进行严格的限定。

二、文件上传漏洞

很多时候因为业务功能需要,一些web站点都有文件上传的接口,比如:

1、注册时上传头像图片(比如jpg,phg,gif等)

2、上传文件附件(doc,xls等)

但是在后台开发时,没有对上传的文件功能进行安全考虑或采用了有缺陷的措施,导致攻击者可以通过一些手段绕过安全措施从而上传一些恶意文件(如:一句话木马),从而通过对该恶意文件的访问来控制整个web后台。

1、测试流程

  • 对文件上传的地方按照要求上传文件,查看返回结果(路径,提示等);(判断限制的信息,比如弹窗有可能是前端限制)
  • 尝试上传不同类型的“恶意”文件,比如xx.php文件,分析结果。
  • 查看html源码,看是否通过js在前端做了上传限制,可以绕过。
  • 尝试使用不同方式进行绕过:黑名单绕过/MIME类型绕过/目录0x00截断绕过等。
  • 猜测或结合其他漏洞(比如敏感信息泄露等)得到木马路径,连接测试。

2、靶场测试

  • 第一关client check (前端绕过)

    尝试上传一张图片,结果说是权限不足

    image-20210214174711837

    然后更改目录权限:chmod 777 unsafeupload

    image-20210214174903733

    然后上传成功!

    image-20210214183331694

    尝试上传php文件,结果失败:

    image-20210214183752915

    出现弹窗,猜测是前端做了限制,于是页面审查元素:

    image-20210214184035619

    查看网页源码,发现是checkFileExt()函数做了过滤:

    image-20210214190316913

    于是,直接更改前端代码,重新上传:

    image-20210214190615208

    木马上传成功:

    image-20210214190737749

    image-20210214190802359

    命令执行成功!

    image-20210214190925651

  • 第二关MIME type (服务端绕过)

    知识补充:

    什么是MIME?

    MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问时,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件的打开方式。

    每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图像image等,后面定义具体的种类。常见的MIME类型,比如:

    超文本标记语言文本 .html text/html

    普通文本 .txt text/plain

    RTF文本 .rtf application/rtf

    GIF图形 .gif image/gif

    JPEG图形 .ipeg,.jpg image/jpeg

    $_FILES()函数

    通过使用PHP的全局变量数组$_FILES,你可以从客户计算机向远程服务器上传文件。第一个参数是表单的input name,第二个下标可以是“name”,“type”,“size”,“tmp_name”或“error”。例如:

    • $_FILES[file][name] 被上传文件的名称
    • $_FILES[file][type] 被上传文件的类型
    • $_FILES[file][type] 被上传文件的大小,以字节计算
    • $_FILES[file][size] 被上传文件的临时副本的名称
    • $_FILES[file][error] 由文件上传导致的错误代码

先按要求上传一个图片测试一下:

image-20210214213749513

如图所示,上传成功!

尝试上传php文件:

image-20210214213920628

如图所示,报错!

用brupsuite抓包看看:

image-20210214220341751image-20210214220554724

更改数据包重发:

image-20210214220807150

如图,更改后文件上传成功!

image-20210214221002407image-20210214221208820

然后可以利用传参的方式执行一句话木马了。

  • 第三关getimagesize (服务端绕过)

知识补充:

getimagesize()函数

用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。

image-20210215145419700 image-20210215145448657

getimagesize()通过文件头部的字符串来判断文件的类型

比如:查看一张png图片的十六进制

image-20210215150702294

该图片格式的头部都是8950 4e47,所以就判断它是一个png格式的图片。

制作图片木马--------------------------------------------------------------------------------------------------

也就是说在图片十六进制信息的末端添加一句话木马,从而将木马伪装成图片:

在windows下,将php文件添加到图片文件中生成新的图片ccc.png

copy /b ai.png + test.php ccc.png

image-20210215152702153

将ccc.png文件上传:

image-20210215152932417

在服务器端查看ccc.png文件的十六进制信息:

xxd ccc.png

image-20210215153256120

发现php文件内容已被写入图片末端。

这时发现虽然php代码已被写入图片并且上传在服务器中,但是无法运行php代码,这时我们就要结合本地文件包含漏洞,将图片文件包含在后端代码中运行。

于是需要猜测木马图片文件的目录(一般情况下需要暴力破解),并且拼接到含有本地文件上传漏洞的url中的参数中,多试几次跳转到所在目录中,成功包含并输出php代码的内容(phpinfo()):

image-20210215200132262

3、防范措施

  • 不要在前端使用JS实施上传策略
  • 通过服务端对上传的文件进行限制:
    • 进行多条件组合检查:比如文件的大小、路径、扩展名、文件类型、文件完整性
    • 对上传的文件在服务器上存储时进行重命名(制定合理的命名规则)
    • 对服务器端上传文件的目录进行权限控制(比如只读),限制执行权限带来的危害。

猜你喜欢

转载自blog.csdn.net/qq_43665434/article/details/113818940