Java代码审计之致远HtmlOfficeServlet漏洞分析

Java代码审计之致远HtmlOfficeServlet漏洞分析

img

command+单击,跟进到jar包里的HtmlOfficeServlet.class文件,对doGet方法的第一行打断点

img

burp发包

img

成功到了断点处

img

切换到Console标签,Mac会出现下面三个图标。

第一个是按照流程代码一行行的往下跑,遇见方法时不会进入该方法体内 等价于 F8 步过

第二个是如果有方法则进入方法内部 等价于 F7 步入

第三个是当前流程的代码块跑完,跳到上一层代码块 等价于 SHIFT+F8 步出

img

按F9到下一个调试点,如果没有调试点了,则直接把程序跑完,burp那边就有响应包了。

第29、30行通过getBean获取实例化对象(handWriteManager、htmlHandWriteManager)

第31行实例化iMsgServer2000对象

img

第34行 handWriteManager.readVariant(request, msgObj); 从请求中获取传递的值

img

选择第二个按钮,即F7步入 跟入到对应的handWriteManager.class文件里

img

选择第一个按钮,即F8步过

例如 msgObj.GetMsgByName(“originalFileId”) 是读取请求包的originalFileId的值,并按照致远自定义的base64解码得到值

关于致远自定义的base64的编码和解码,后面会介绍如何自己实现

img

img

继续选择第一个按钮,即F8步过,此时程序运行完了readVariant,跳回到doGet代码块里,来到了下一行代码if判断语句里

img

继续选择第一个按钮,即F8步过,获取OPTION的值,并base64解码后得到值为SAVEASIMG

img

此时代码跳到了SAVEASIMG的if判断代码块里,获取FILENAME的值,并base64解码后得到值为自定义的shell的路径

img

到MsgFileSave方法,传递参数值为shell的路径

img

选择第二个按钮,即F7步入 跟入到对应的iMsgServer2000.class文件里的MsgFileSave方法

就是很简单的文件流写入内容

img

到这里就结束了。

这里注意的是POC里的666是要写入内容的长度,在Debug里也能看到共写入666长度的内容,如果少于666,则用null填充

img

img

img

参考链接

https://cloud.tencent.com/developer/article/1817235

   转载规则


《Java代码审计之致远HtmlOfficeServlet漏洞分析》 ske 采用 知识共享署名 4.0 国际许可协议 进行许可。