pikachu-不安全的文件下载和上传

不安全的文件下载(Unsafe Filedownload)

概述

文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。 如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞。
此时如果 攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如../../../etc/passwd),则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息(密码文件、源代码等)被下载。 所以,在设计文件下载功能时,如果下载的目标文件是由前端传进来的,则一定要对传进来的文件进行安全考虑。

切记:所有与前端交互的数据都是不安全的,不能掉以轻心!

案例演示

打开pikachu中的Unsafe filedownload,可以点击图片下方的名字下载图片,复制链接到一个新的标签页打开

 

 

当我们点击名字的时候,查看URL我们知道其实是浏览器发送了一个get请求到后台,后台会根据提交的filename查找文件,然后读取后再响应输出到前端,浏览器再将文件下载下来。

 

如果后台不够严格,在filename这里就会出现漏洞。

 接下来我们可以像本地文件包含一样去通过目录遍历进行测试。我们尝试下载系统固定的配置文件hosts

 我们修改filename值为 ../../../../../../../../../../Windows/System32/drivers/etc/hosts 通过多个../跳转到根目录下。

 

我们成功下载了hosts文件

 

 查看后端代码,当在页面点击链接的时候,a标签会通过get请求传一个参数到后台,后台没有做任何的处理,后台会获取文件名然后直接拼接到download目录下,接着后台会对文件进行读取并计算它的长度,然后放到Header响应,最后循环读取文件字节流后返回到前端。最根本的原因就是后台没有对传进来的文件判断是否是目录里的文件,就直接读取了

 

 

 

 防范措施

  1. 对传入的文件名进行严格的过滤和限定
  2. 对文件下载的目录进行严格的限定

 

 

不安全的文件上传(Unsafe Fileupload)

概述

文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等,然后将其按照设计的格式进行重命名后存储在指定的目录。 如果说后台对上传的文件没有进行任何的安全判断或者判断条件不够严谨,则攻击着可能会上传一些恶意的文件,比如一句话木马,从而导致后台服务器被webshell。 所以,在设计文件上传功能时,一定要对传进来的文件进行严格的安全考虑。比如:
--验证文件类型、后缀名、大小;
--验证文件的上传方式;
--对文件进行一定复杂的重命名;
--不要暴露文件上传后的路径;
--等等...

文件上传漏洞测试流程

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

客户端验证绕过(client check)

打开pikachu的client check,首先尝试上传一个php文件,提示上传的文件不符合要求

 

 因为是直接从前弹窗提示,我们打开web控制台查看源码,可以看到在input标签里的onchange,就是说当他状态发送改变的时候就会调用checkFileExt(this.value)

 

 我们来看checkFileExt(this.value)源码,heckFileExt函数会对文件类型进行判断,如果不是"jpg","png","gif"三种类型的文件就会弹窗报错

也就是说是通过前端JavaScript进行限制,还是那一句话所有在前端进行的操作只能起到辅助性的作用并不能起到实际性的作用

比如说我们可以在前端,通过控制台修改代码就是删除checkFileExt(this.value)

 

 通过控制台删除checkFileExt(this.value)

 

 再次上传php文件,成功上传

 

 服务端验证绕过(MIME)

概述

MIIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩 展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。常见的MIME类型,比如:
超文本标记语言文本.html,.html texthtml
普通文本.txt text/plain
RTF文本.rtf application/rtf
GIF图形.gif image/gif
JPEG图形.ipeg,jpg image/jpeg

打开pikachu的MIME type上传一张图片,成功。接着尝试上传php文件,失败。

 

 

 

 

 打开burp suite抓包工具,把抓取到的上传文件失败的包发送到Repeater

 

 在Repeater中修改文件类型,把Content-Type的值修改为image/png

 

 点击GO,成功上传

 

 查看后台代码可以看到它定义了三个都是图片格式的类型,然后它会对前端上传的文件调用upload_sick函数去检查,在upload_sick中,它有用$_FILES函数去判断验证是否发生错误,如果发生错误就会弹出相关的信息。

 

 

 

 

 

服务端验证绕过(getimagesize)

概述

Getimagesize ( )函数返回结果中有文件大小和文件类型,如果用这个函数来获取类型,
从而判断是否是图片的话,会存在问题。因为图片头是可以被伪造的,所以可以绕过限制。
在pikachu的getimagesize中上传的文件的后缀名不能为空,且必须是jpg,jpeg,png中的一个

 

 

 我们可以通过伪造图片头来绕过,我们准备一张正常图片和php木马文件

 

 

 

 在Windows系统中,可以通过cmd来生成图片马,在cmd中输入以下代码从而生成图片马

 copy /b kb.png + phpinfo.php muma.png 

 

 成功生成图片木马

 

 然后再pikachu靶场中。将这图片木马上传,返回保存路径

 

 在浏览器URL输入图片的路径,浏览器会显示这张图片,但图片里面的代码并没有执行

 

 这时候我们可以通过文件包含漏洞来利用这个图片木马,因为include函数会包含上传的文件执行任意代码,我们可以利用它的这个漏洞执行木马。

在本地文件包含中,选择一项点击提交,把URL中的filename的值修改为图片木马的路径

 ../../unsafeupload/uploads/2020/07/17/9017195f11d80619983108237945.png 

 

 木马代码被成功执行,获取到了后台php的版本信息。

防范措施

  • 不要在前端使用JS实施上传限制策略
  • 通过服务端对上传文件进行限制:
  1. 进行多条件组合检查:比如文件的大小、路径、扩展名、文件类型、文件完整性
  2. 对上传的文件在服务器上存储时进行重命名(制定合理的命名规则)
  3. 对服务器端上传文件的目录进行权限控制(比如只读) ,,限制执行权限带来的危害
posted @ 2020-09-06 18:52  墨尐丶小傲  阅读(521)  评论(0编辑  收藏  举报