前言
xxl-job Hessian2反序列化漏洞本身是一个挺老的漏洞了,影响版本也比较老,在一次项目中碰到了xxl-job,其/api接口可以未授权访问存在hessian2反序列化漏洞,但是不出网,于是有了这次利用。
漏洞分析
XXL-JOB <= 2.0.2,其/xxl-job-admin/api接口可以未授权访问,该接口存在Hessian2反序列化漏洞。
未授权是因为设置了@PermessionLimit(limit=false)导致的。
invokeAdminService方法中调用了handle方法。
handle方法中满足if条件后,调用了parseRequest方法。
在parseRequest方法中,获取请求的数据后,会调用this.xxlRpcProviderFactory.getSerializer().deserialize方法对传入的数据进行反序列化。
this.xxlRpcProviderFactory.getSerializer()返回的是HessianSerializer。
其deserialize方法中进行了Hessian2反序列化。
利用链构造
网上提到的大部分都是jndi注入利用,在不出网的情况下就难以利用,这里选择利用hessian jdk原生反序列化利用链,其原理就是通过SerializerFactory.setAllowNonSerializable(true)关闭Serializable派生类检查,使得没有继承Serializable的类也可以反序列化。
javax.swing.UIDefaults中的内部类ProxyLazyValue的createValue中存在类方法的反射调用,可以调用任意类的静态public方法,调用堆栈如下图:
这里可以选择com.sun.org.apache.bcel.internal.util.JavaWrapper类的_main
方法,加载恶意类的_main
方法。
也可以使用sun.reflect.misc.MethodUtil.invoke反射调用sun.misc.Unsafe.defineClass方法来加载字节码,然后再实例化这个类。
回显利用
bcel
invoke反射调用defineClass
发送第一个包加载类字节码。
发送第二个包实例化该类。
因为微信公众号和阿里云盘都无法直接分享压缩包文件,payload项目这部分就打包放星球了。师傅们可以自己构造利用。
参考链接
https://xz.aliyun.com/t/11091
https://yzddmr6.com/posts/swinglazyvalue-in-webshell/
https://blog.wanghw.cn/security/hessian-deserialization-jdk-rce-gadget.html
原文始发于微信公众号(良月安全):[漏洞利用]xxl-job Hessian2反序列化漏洞深入利用
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论