作者:kk
本文为作者投稿,Seebug Paper 期待你的分享,凡经采用即有礼品相送!
投稿邮箱:paper@seebug.org
在几天前,我就收到致远OA的RCE漏洞部分详情,但是并没有引起重视。当时获得的POC部分只包括了任意文件上传的数据包,但并没有其余详情,且数据包中重要数据都被编码过了。原以为又是一次恶作剧。没想到啊。 由于漏洞本身没什么好讲的,现在让我们来看看这个POC中涉及的编码算法,看看原始的POC中的编码数据是做什么的。 首先漏洞位置在htmlofficeservlet,通过一段时间的寻找我找到了一份旧的Seeyon OA的源码: https://github.com/zhf839428881/seeyon_v3x/
其中这个接口的实现在HtmlOfficeServlet.java
文件内。
通过这份代码我们知道接口对参数的获取使用的是DBstep.iMsgServer2000.GetMsgByName
方法。 关键代码:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
CurrentUserToSeeyonApp.set(request.getSession());
ApplicationContext ctx = (ApplicationContext) getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
HandWriteManager handWriteManager = (HandWriteManager) ctx.getBean("handWriteManager");
HtmlHandWriteManager htmlHandWriteManager = (HtmlHandWriteManager) ctx.getBean("htmlHandWriteManager");
DBstep.iMsgServer2000 msgObj = new DBstep.iMsgServer2000();
try {
handWriteManager.readVariant(request, msgObj);
msgObj.SetMsgByName("CLIENTIP", request.getRemoteAddr());
String option = msgObj.GetMsgByName("OPTION");
if ("LOADFILE".equalsIgnoreCase(option)) {
handWriteManager.LoadFile(msgObj);
}
else if("LOADSIGNATURE".equalsIgnoreCase(option))
{
ht