【ueditor】任意文件上传漏洞与解决方案

UEditor 是一款颇为老旧的富文本编辑器,曾经普遍流行过所以在一些老的项目里面,还会存在。但是该项目到目前为止已经永久停止更新,所以当发现漏洞时,只能自己维护。最好停止使用并更换富文本编辑器组件,个人推荐modstart-lib/ueditor-plusNotadd/Neditor。这些都是UEditor为核心的二次开发项目,方便升级。

1、漏洞原理

网上关于这个漏洞已经有了十分详细的解释、各路大神已经指明了道路,这边简单介绍一下出现的位置与原理。

1.1出现漏洞的代码位置

文件上传漏洞影响UEditor 的.Net版本,其他版本暂未影响,漏洞出现在图中的CrawlerHandler.cs中,其中controller.ashx是入口。

ueditor 后端工程

在这里插入图片描述
UEditor 在抓取远程数据源的时候,会进入【catchimage】这个分支里面。然后就进入了漏洞出现的CrawlerHandler类中。

在这里插入图片描述

上面是CrawlerHandler类中的漏洞位置,最重要的是if判断语句,只是对ContentType进行了简单的验证,这个黑客留下了余地。

1.2 漏洞实现原理

既然在1.1中已经了解了在图片验证时只验证了ContentType,那我就可以通过工具修改ContentType,躲避掉这个判断,然后就可以进入到接下来的流程中。

而接下来就是下载到服务器操作,从而可以上传全部类型的文件,只需要你自己拥有一台服务器即可。

这个漏洞危险程度之高甚至能获取到服务器的高级权限。具体做法是修改ContentType伪装自己是图片,然后在路径里添加?.aspx绕过获取文件名的检测,然后你就能向服务器上传aspx动态页面文件,从而获取webshell,到了这一步服务器就已经被攻破了。

2.漏洞修复

推荐的修复方式就是在CrawlerHandler类添加文件类型检查的代码,使用各类WAF软件增强服务器防护等级。

网上大部分关于如何添加文件类型检查都只是建议并没有具体实现,这里提供了一个简单的实现方式仅供参考。

 static bool IsImage(HttpWebResponse response)
    {
        using (Stream responseStream = response.GetResponseStream())
        {
            if (responseStream == null || !responseStream.CanRead)
            {
                return false;
            }

            byte[] buffer = new byte[40]; // 40个字节应该足够涵盖大多数格式的文件头
            int bytesRead = responseStream.Read(buffer, 0, buffer.Length);

            return IsJPEG(buffer, bytesRead) || IsPNG(buffer, bytesRead) || IsGIF(buffer, bytesRead)
        }
    }
    
    static bool IsJPEG(byte[] buffer, int bytesRead)
    {
        return bytesRead >= 3 &&
               buffer[0] == 0xFF &&
               buffer[1] == 0xD8 &&
               buffer[2] == 0xFF;
    }

    static bool IsPNG(byte[] buffer, int bytesRead)
    {
        return bytesRead >= 8 &&
               buffer[0] == 0x89 &&
               buffer[1] == 0x50 &&
               buffer[2] == 0x4E &&
               buffer[3] == 0x47 &&
               buffer[4] == 0x0D &&
               buffer[5] == 0x0A &&
               buffer[6] == 0x1A &&
               buffer[7] == 0x0A;
    }

    static bool IsGIF(byte[] buffer, int bytesRead)
    {
        return bytesRead >= 6 &&
               buffer[0] == 0x47 &&
               buffer[1] == 0x49 &&
               buffer[2] == 0x46 &&
               buffer[3] == 0x38 &&
               (buffer[4] == 0x39 || buffer[4] == 0x37) &&
               buffer[5] == 0x61;
    }

尽可能小的改动量下,对类型进行验证,在此代码中:

  • 读取响应流的前几个字节。
  • 通过检查图像格式的特定魔数来判断响应是否为图片格式。

这里列举了4中类型(jpg\jpeg、png、gif)进行判断,可扩展。

通过读取响应流的前几个字节来判断文件类型,实际上已经是一种相对较为安全和通用的方法,特别是在ContentType不可用或不可靠的情况下。这是因为文件头(或魔数)通常是标识文件类型的更直接和可靠的方式。

  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UEditor的PHP版本的文件上传漏洞主要是由于后台没有进行严格的文件类型、大小和内容的检测,攻击者可以通过修改上传文件的文件名和后缀来绕过检测,上传恶意文件,从而在服务器上执行任意代码。 攻击者可以通过以下方式来利用文件上传漏洞: 1. 修改文件名和后缀:攻击者可以将恶意文件的文件名和后缀修改为常见的图片、文档或者压缩文件的后缀名,来绕过后台的文件类型检测。比如将恶意文件的文件名修改为“test.jpg”,就可以上传一个恶意的PHP文件,并且绕过后台的检测。 2. 绕过文件大小限制:攻击者可以通过改变文件上传请求中的Content-Length值,来绕过后台的文件大小限制。比如,攻击者可以使用Burp Suite等工具,修改Content-Length值,将一个超过限制大小的文件上传到服务器。 为了防止文件上传漏洞的利用,应该对上传的文件进行严格的文件类型、大小和内容的检测。具体措施可以包括: 1. 对上传文件的后缀名进行白名单过滤,只允许上传指定的文件类型。 2. 对上传文件的大小进行限制,限制上传文件的大小不能超过最大限制值。 3. 对上传文件的内容进行检测,防止上传恶意文件。 4. 对上传目录进行安全设置,禁止直接访问上传目录下的文件。 5. 定期清理上传目录,删除不必要的文件。 总之,为了保障网站的安全性,必须加强文件上传的安全控制,防止恶意文件的上传和执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值