• 【Web安全】文件上传漏洞


    目录

    1. 文件上传漏洞概述

    1.1 FCKEditor文件上传漏洞

    1.2 绕过文件上传检查功能

    2. 功能还是漏洞

    2.1 Apache文件解析

    2.2 IIS文件解析

    2.3 PHP CGI路径解析

    2.4 利用上传文件钓鱼

     3. 设计安全的文件上传功能


    1. 文件上传漏洞概述

    文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务端命令的能力。

    应用:例如上传一张图片、分享一段视频、论坛发帖时附带附件、发邮件时附带附件……

    文件上传后导致的安全问题一般有:

    • 上传文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行
    • 上传文件时Flash的策略文件crossdomain.xml,黑客用以控制Flash在该域下的行为
    • 上传文件时病毒、木马文件,黑客诱骗用户下载执行
    • 上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈
    • 将上传文件作为一个入口,溢出服务器的后台处理程序,如图片解析模块
    • 上传一个合法的文本文件,其内容包含PHP脚本,再通过本地文件包含漏洞执行该脚本
    • ……

    要实现webshell,要满足以下几个条件:

    1. 上传的文件能被Web容器解释执行,文件上传后的目录是Web容器所覆盖到的路径
    2. 用户能从Web上访问这个文件
    3. 文件不会被安全检查、格式化、图片压缩等功能改变内容而导致攻击不成功

    1.1 FCKEditor文件上传漏洞

    FCKEditor是一款非常流行的富文本编辑器,其上传文件的功能能将用户上传的文件保存在/UserFiles/all/目录下

    在有漏洞的版本中,通过黑名单来确认文件的安全性

    以上述黑名单为例,当我们上传后缀为php2、php4、inc、pwml、asa、cer等文件时就能绕过

    1.2 绕过文件上传检查功能

    • %00截断

    在 C、PHP等语言的常用字符串处理函数中,0x00被认为是终止符,因此在文件名后添加一个%00字节,可以截断某些函数对文件名的判断

    例如只允许上传JPG图片,可以构造文件名xxx.php[\0].JPG,其中[\0]为十六进制的0x00字符,.JPG绕过了应用的上传文件类型判断,但对于服务器端来说,此文件因为0x00字符截断,会变成xxx.php

    • 伪造文件头

    有的应用会通过文件头验证文件类型

     常见的攻击技巧是伪造一个合法的文件头,将真实的PHP等脚本代码附在文件头之后

    但仍需要通过PHP来解释此图片文件才行,若上传的文件后缀是JPG,则Web Server可能会将此文件当作静态文件解析,不会调用PHP解释器,也就无法进行攻击 

    2. 功能还是漏洞

    2.1 Apache文件解析

    Apache对于文件名的解析是从后往前解析的,直至遇见一个Apache认识的文件类型为止

    例如:

    phpshell.php.rar.rar.rar.rar.rar

    Apache不认识.rar文件类型,会一直遍历到.php,认为这是一个PHP类型的文件

    黑客就可以利用该特性绕过对后缀名的限制,实现php脚本的执行

    (在Apache的mime.types文件中定义了它所认识的文件)

    2.2 IIS文件解析

    • 分号“;”是截断字符

    当文件名为abc.asp;xx.jpg时,IIS 6 会将此文件解析为abc.asp,从而导致脚本被执行

    • 曾经出现过因处理文件夹扩展名出错,导致将/*.asp/目录下的所有文件都作为ASP文件进行解析
    • PUT方法允许用户上传文件到指定目录下,结合MOVE方法可以将原本只允许上传文本文件改写为脚本文件,从而执行webshell

    2.3 PHP CGI路径解析

    Nginx作为代理把请求转发给fastcgi Server,PHP在后端处理。(使用Nginx作为Web Server时,一般使用fastcgi的方式调用脚本解释器。)

    当访问

    http://www.xxx.com/path/test.jpg/notexist.php

    时,会将test.jpg当作PHP解析。notexist.php是不存在的文件。

    如果在任何配置为 fastcgi的PHP应用里上传文件,其内容是PHP文件,则将导致代码执行。

    原因:

    PHP的配置文件中 cgi.fix_pathinfo=1默认开启

    在上面的例子中,PATH_INFO=notexist.php,因为notexist.php不存在,会往前递归查询路径确认文件的合法性。此时SCRIPT_FILENAME检查文件是否存在,其值为/path/test.jpg,而此时PATH_INFO还是notexist.php,在最终执行时,test.jpg会被当作PHP解析。

    2.4 利用上传文件钓鱼

    利用文件上传功能,钓鱼者可以先将包含了HTML的文件(例如一张图片)上传到目标网站,然后通过传播这个文件的URL进行钓鱼,该URL中不会出现钓鱼地址。

     png是伪造的文件头绕过上传时的文件类型检查,后面的脚本控制浏览器跳向指定的钓鱼网站,骗子在传播钓鱼网站时,只需要传播合法图片的URL

     

     3. 设计安全的文件上传功能

    • 文件上传的目录设置为不可执行
    • 判断文件类型时可以结合MIME Type、后缀检查等方式,使用白名单
    • 对于图片的处理使用压缩函数或resize函数,在处理图片的同时破坏其中可能包含的HTML代码
    • 使用随机数改写文件名和文件路径
    • 单独设置文件服务器的域名
  • 相关阅读:
    计算机网络(下)
    My Ninety-ninth Page - 两个字符串的删除操作 - By Nicolas
    显而易看app的订阅内容
    Java笔记:垃圾回收
    电脑带不动虚幻引擎渲染卡顿怎么办?本文给你支招
    Docker从安装使用到配置各种镜像容器
    Django笔记三十四之分页操作
    next.js 集成redux
    句向量模型之SimCSE——Pytorch
    UE学习记录07----C++中使用事件委托
  • 原文地址:https://blog.csdn.net/m0_51683653/article/details/128177273