pikachu靶场练习——不安全的文件下载和上传

不安全文件下载(Unsafe file download)

概述

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

很多网站都会提供文件下载功能,即用户可以通过点击下载链接,下载到链接所对应的文件。但是,如果文件下载功能设计不当,则可能导致攻击者可以通过构造文件路径,从而获取到后台服务器上的其他的敏感文件。( 又称:任意文件下载)

在pikachu靶场中,可以通过点击图片下的名字下载图片,复制链接到一个新的标签页打开

我们通过浏览器的URL可以知道,这和本地文件包含一样的,通过get请求发送到后台,后台会根据提交的filename内容查找文件,然后读取后再响应输出到前端,浏览器就可以下载文件了

 接下来我们可以像本地文件包含一样去通过目录遍历进行测试。输入的目录得是对应系统的目录,这里我是把pikachu安装在Windows系统上,所以得输入Windows的文件目录路径,如果是安装在Linux系统上的,就得输入Linux的目录路径,可以输入多个“../”这样可以跳到根目录。这里我想获取的是hosts的信息

../../../../../../../../../../Windows/System32/drivers/etc/hosts

filename的值修改为想要获取的文件路径

成功获取到hosts信息

 

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

 

文件上传绕过(client check)

 概述

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

 

在pikachu靶场中点击浏览上传文件,提示上传的文件不符合要求

查看后端代码,可以看到它是通过JavaScript来对前端进行限制,如果上传的文件不是图片的格式就不能上传,但所有在前端进行的操作只能起到辅助性的作用并不能起到实际性的作用,这是很容易绕过的!

可以打开web控制台,把onchange的值删掉,进行绕过,上传我们想要上传的文件

在这里,我上传了冰蝎(Behinder一个神奇的webshell工具)自带的shell.php文件

 打开冰蝎,新增输入对应的URL,接下来可以通过冰蝎的选项获取我们想要的信息,在这里我想要获取后台服务器的IP地址,在命令执行中输入ipconfig

 

 分析漏洞产生原因:其实和前面讲的一样,它把安全限制通过JavaScript写在了前端,而这恰恰是最容易绕过的!

 

 文件上传(MIME type)

 概述

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靶场中上传一张正常的图片显示上传成功,而上传php文件则显示上传失败,只能上传图片文件格式!

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

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

修改后点击Go,查看右边的Raw显示文件上传成功。 上传成功后,就可以像前面client check讲的一样,通过上传的文件进行访问、传参,控制后台服务器等等。

 

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

 

 

文件上传(getimagesize)

概述

Getimagesize ( )函数返回结果中有文件大小和文件类型,如果用这个函数来获取类型,从而判断是否是图片的话,会存在问题。因为图片头是可以被伪造的,所以可以绕过限制。

 

在pikachu靶场中,它只能上传图片格式文件,如果是别的格式文件,则不能上传

 我们可以通过图片和木马文件,来制作图片木马,从而绕过限制。

准备一张正常的图片和木马文件

 

在Windows系统中,可以通过cmd来生成图片马,在cmd中输入以下代码从而生成图片马(注:cmd在输入生成图片木马代码前,要先跳转到图片和木马文件保存的目录下)

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

回到pikachu靶场,上传生成的图片木马,能看得到成功上传后保存的路径

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

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

在本地文件包含中,选择一项点击提交,把URL中的filename的值修改为图片木马的路径(前面的“../”可以一个一个的加进去试)

../../unsafeupload/uploads/2020/07/09/9334175f07266156c88409531983.png

提交后,可以看到图片木马里面的代码被执行了,获取了后台php版本信息

 

防范措施

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

 

posted on 2020-07-09 22:37  青日GO(*/ω\*)  阅读(547)  评论(0编辑  收藏  举报