如果觉得该文章有帮助的,麻烦师傅们可以搜索下微信公众号:良月安全。点个关注,感谢师傅们的支持。
免责声明
本公众号所发布的所有内容,包括但不限于信息、工具、项目以及文章,均旨在提供学习与研究之用。所有工具安全性自测。如因此产生的一切不良后果与文章作者和本公众号无关。如有涉及公司与个人敏感信息,侵权烦请告知,我们会立即删除并致歉。
前言
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项目这部分就打包放星球了。师傅们可以自己构造利用。