Java代码审计之致远HtmlOfficeServlet漏洞分析
command+单击,跟进到jar包里的HtmlOfficeServlet.class文件,对doGet方法的第一行打断点
burp发包
成功到了断点处
切换到Console标签,Mac会出现下面三个图标。
第一个是按照流程代码一行行的往下跑,遇见方法时不会进入该方法体内 等价于 F8 步过
第二个是如果有方法则进入方法内部 等价于 F7 步入
第三个是当前流程的代码块跑完,跳到上一层代码块 等价于 SHIFT+F8 步出
按F9到下一个调试点,如果没有调试点了,则直接把程序跑完,burp那边就有响应包了。
第29、30行通过getBean获取实例化对象(handWriteManager、htmlHandWriteManager)
第31行实例化iMsgServer2000对象
第34行 handWriteManager.readVariant(request, msgObj); 从请求中获取传递的值
选择第二个按钮,即F7步入 跟入到对应的handWriteManager.class文件里
选择第一个按钮,即F8步过
例如 msgObj.GetMsgByName(“originalFileId”) 是读取请求包的originalFileId的值,并按照致远自定义的base64解码得到值
关于致远自定义的base64的编码和解码,后面会介绍如何自己实现
继续选择第一个按钮,即F8步过,此时程序运行完了readVariant,跳回到doGet代码块里,来到了下一行代码if判断语句里
继续选择第一个按钮,即F8步过,获取OPTION的值,并base64解码后得到值为SAVEASIMG
此时代码跳到了SAVEASIMG的if判断代码块里,获取FILENAME的值,并base64解码后得到值为自定义的shell的路径
到MsgFileSave方法,传递参数值为shell的路径
选择第二个按钮,即F7步入 跟入到对应的iMsgServer2000.class文件里的MsgFileSave方法
就是很简单的文件流写入内容
到这里就结束了。
这里注意的是POC里的666是要写入内容的长度,在Debug里也能看到共写入666长度的内容,如果少于666,则用null填充
参考链接
https://cloud.tencent.com/developer/article/1817235