文件上传、文件包含、文件下载漏洞总结

文件上传

原理

        上传文件对各大网站基本属于必备功能,如上传头像,上传简历,上传文档,但是一旦未对文件进行校验,或检验、过滤的不严格,恶意用户即可绕过网站的检测上传恶意文件,一旦上传的是木马文件并被服务器解析,恶意用户即可拿到网站的webshell。

分类

        根据upload-labs的总结,上传客户端:

        Js检查

        使用图片马

        修改webshell后缀名并用bp截断修改回后缀名并完成上传

服务器端:

        检查后缀

                黑名单

                        上传特殊可解析后缀

                        上传.htaccess

                        后缀大小写绕过

                        后缀名双写绕过

                        点绕过

                        ::$DATA绕过

                        空格绕过

                        双写绕过

                        配合解析漏洞绕过

                        Apache换行解析漏洞,Apache陌生后缀名解析漏洞,Nginx任意解析漏洞,ISS6.*版本解析漏洞,ISS7.*版本解析漏洞,

                        Nginx空字节任意代码执行漏洞

                        Nginx文件名逻辑漏洞

                白名单

                        MIME绕过

                        %00截断

                        0x00截断

        检查内容

                文件头检查

                图片马

                二次渲染

                突破getimagesize()

                突破exif_imagetype()

        代码逻辑

                条件竞争

防护:

1、对上传的文件,返回数据包时隐藏上传文件的路径

2、服务器端的安全过滤,对上传文件的类型、以及后缀名进行严格的把控

3、上传类型进行安全限制,JS前端以及后端一起做双层的安全限制,对文件的扩展名安全检测,MIME文件类型安全检测,上传的文件大小限制

4、对上传的目录进行文件夹安全限制,去掉目录的脚本执行权限,只有普通jpg图片等运行,以及读写权限

文件包含

原理:

        服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间。这意味着您可以创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时,您只更新一个包含文件就可以了,或者当您向网站添加一张新页面时,仅仅需要修改一下菜单文件(而不是更新所有网页中的链接)。

        文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。

<?php      $filename  = $_GET['filename'];      include($filename);  ?>

分类:

本地包含漏洞(LFI)

        无限制本地包含漏洞

        Session文件包含漏洞

                利用条件:session的存储位置可以获取,可通过phpinfo                漏洞利用:session中的内容可以被控制,传入恶意代码,通过本地包含漏洞即可解析恶意代码getshell。

        有限制本地包含漏洞

                %00截断

                路径长度截断

                点号截断

远程包含漏洞(RFI)

        PHP的配置文件allow_url_fopen和allow_url_include设置为ON,include/require等包含函数可以加载远程文件,如果远程文件没经过严格的过滤,导致了执行恶意文件的代码,这就是远程文件包含漏洞。

allow_url_fopen = On(是否允许打开远程文件)  allow_url_include = On(是否允许include/require远程文件)

无限制远程文件包含漏洞

有限制远程文件包含漏洞

        问号绕过

        #绕过

        空格绕过

PHP伪协议

        PHP 带有很多内置 URL 风格的封装协议,可用于类似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数。 除了这些封装协议,还能通过 stream_wrapper_register() 来注册自定义的封装协议。

        可以使用 "php://filter"伪协议" 来进行包含。当它与包含函数结合时,php://filter流会被当作php文件执行。若对其进行编码,阻止其不执行。即可导致任意文件读取。

?file=php://filter/read=convert.base64-encode/resource=a.php

防护

1.严格判断包含中的参数是否外部可控。

2.路径限制,限制被包含的文件只能在某一个文件夹内,特别是一定要禁止目录跳转字符,如:“../”。

3.基于白名单的包含文件验证,验证被包含的文件是否在白名单中。

4.尽量不要使用动态包含,可以在需要包含的页面固定写好,如:“include("head.php")”。

5.可以通过调用str_replace()函数实现相关敏感字符的过滤,一定程度上防御了远程文件包含。

文件下载

原理:

        网站对下载的文件没有做限制,直接通过绝对路径对其文件进行下载,那么,恶意用户就可以利用这种方式下载服务器的敏感文件,对服务器进行进一步的威胁和攻击。

危害:

        通过任意文件下载,可以下载服务器的任意文件,web业务的代码,服务器和系统的具体配置信息,也可以下载数据库的配置信息,以及对内网的信息探测等等。

防范:

        限制../符号的使用,文件下载时判断输入的路径,最好的方法是文件应该在数据库中进行一一对应,避免通过输入绝对路径来获取文件

版权声明:玥玥 发表于 2021-07-29 13:41:08。
转载请注明:文件上传、文件包含、文件下载漏洞总结 | 女黑客导航