前言
今天来分析一下FOG远程命令执行(CVE-2024-39914)漏洞,这个漏洞是七月份爆出来了,目前最新版已经修复,如果需要复现可以下载1.5.10.34之前的版本,我用的是1.5.10版本分析。
源码下载地址:
https://github.com/FOGProject/fogproject/releases/tag/1.5.10
漏洞分析
这个漏洞网上公布信息说是在FOG 在 /fog/management/export.php 中存在命令注入漏洞
打开下载的代码,web源代码在packages下的web目录
然后找到存在漏洞的文件看一下
然后解读一下这里的几行代码
23行中将session中的foglastreport值反序列化为对象,24行判断反序列化后的对象是否是ReportMaker类型,如果不是的话对调用getClass方法,这里跟进一下getclass方法
因为传进来的参数是:ReportMaker,所以前面的判断都是不成立的,然后看467行,ReflectionClass是PHP中的一个反射类,这里的这个代码的功能是动态的去实例化这个类,然后看下接下来的代码,因为export.php调用这个类时只写了一个参数,那么$props就是默认的参数false,470行的判断不成立,然后继续往下看,475行获取反射类的构造函数,然后可以在export.php最下面那行跟进去看下,有构造函数的,然后就继续往下看if里的代码,又有if (count($args) === 1) 换个判断,然后往上找这个参数值是什么
func_get_args这个函数的作用是返回调用函数参数的个数,然后如下图,调用时传了一个参数
然后走进479行代码,将传的参数给ReportMaker这个类的构造函数,最后返回。
然后跟进export.php的27行代码outputReport方法看下
可以看到147行和148行使用过滤器接收两个get传参,但是过滤器这里用的是默认的过滤参数,这里并不会进行任何的过滤,这里如果不知道这个过滤器都过滤了什么,可以将代码单独拿出来,执行一下看看过滤了什么。
接下来看一下payload是怎么写的
POST /fog/management/export.php?filename=$(echo+'kpvyggzrnonvuycaipvl'+>+qzjtyryy.php)&type=pdf HTTP/1.1
是发送了一个post请求,参数是通过url传递,filename这个参数是命令执行的关键,这里主要看一下对filename都进行了哪些处理
这里相当于什么也没干,只要filename变量存在的话然后判断一下是否是字符串类型
接下来往后看,这里将文件名拿出来
这里也是没做什么处理
然后来到case这里,找一下pdf对应的数字是几
跟进
可以看到pdf是2
这里将filename变量写到文件名上
然后这里又将恶意代码放到了数组里,赋值给了cmd
然后这里去执行了这个命令,最终导致任意命令执行