安全矩阵

 找回密码
 立即注册
搜索
查看: 4010|回复: 0

禅道11.6 后台多个漏洞复现分析

[复制链接]

114

主题

158

帖子

640

积分

高级会员

Rank: 4

积分
640
发表于 2020-7-24 10:47:23 | 显示全部楼层 |阅读模式
禅道11.6 后台多个漏洞复现分析

原创 Arice
来源于公众号:雷神众测 昨天
来自专辑:禅道11.6后台漏洞复现分析
原文链接:https://mp.weixin.qq.com/s?__biz ... 8a1fcbc183d841c4#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函数是显示出该目录的绝对路径

例子:
<?phpecho realpath('/tmp/test');?>
输出结果:
/private/tmp/test

这里有一个点,按照上一步我们写入的/tmp/test 文件来看。我们这里包含/tmp/test就可以了。
但是实际上是报错的


读代码发现上述代码中
$fileName  = dirname($filePath);
dirname函数返回的是目录名称部分(不含文件名,默认最末级为文件名)
例子:
<?phpecho 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/testwebC:/testC:/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/20200 ... 4572623cbf9c857.png




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-9-20 00:45 , Processed in 0.012889 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表