CSeroad
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
前言
众所周知,多个oa中都使用了金格iWebOffice控件。但在不同的oa中exp多少存在差异性,尝试从代码层一探究竟。
简介
金格iWebOffice控件是一种文档控件,能够在浏览器上进行编辑word文档、excel表格等文档最终保存在服务器上,手写签名、电子签章广泛应用于此。所以oa都喜欢使用。
漏洞分析
以某oa为例,本地搭建OfficeServer.jsp进行访问。
首先创建iWebOffice类的实例,officeServer对象调用ExecuteRun方法。并传入request、response。
在ExecuteRun方法里,会创建出数据库对象和创建信息包对象。
iMsgServer2000 方法里DBSTEP V3.0
字符串赋值为this._$906
,this._$903
创建出临时文件。
而后调用deleteOnExit方法删除临时文件。
回到ExecuteRun方法里,往下判断请求方法是否为Post请求。
即必须使用Post方法进行请求。
当使用Post方法请求时,首先进入MsgObj.Load方法。跟进该方法。
一个修改编码的操作,然后调用了_$1027
方法。
在该方法里以输入流的方式一次性读取到mRead,而后从mRead中读取64位长度保存到HeadString字符串中。
接下来截取HeadString字符串的0-15位赋值为this._$906
,16-31位赋值为BodySize(int类型),32-47位赋值为ErrorSize(int类型),48-63位赋值为this._$907(int类型)
即FileSize。
代码走到这个地方,我们可以尝试初步构造一下这64位长度。
aaaaaaaaaaaaaaaa1 2 3
debug 跟踪一下
和我们计算的一样。
然后mRead会继续读取BodySize大小的数据并赋值为this._$904
。
畅读付费文章
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)