禅道 11.6版本下载地址
本次复现环境windows
先搞清楚禅道参数的传递方式,进入index.php慢慢看
先发现了这个语句:
这个导致禅道的查看版本信息的漏洞 跟进看一下
查看版本漏洞
复现payload:http://ip/zentao/index.php?mode=getconfig
跟进exportConfig()
文件位置:zentao\framework\router.class.php
调用父类的exportConfig() 跟进发现信息泄露的根源。
zentao\framework\base\router.class.php
传参方式:
在index.php中发现app对象的创建跟进
根据$app找到了config中的解析配置
zentao\config\config.php
有三种请求类型 PATH-INFO类型模式的分割符为‘-’
根据index.php中的parserequest()找到将url分割为参数的方法。找到parserequest()方法
zentao\framework\base\router.class.php 跟进setRouteBypathinfo()
发现分割方式为:将url分割为 模块名 : 方法名
参数传递过程 在index.php中总体流程就是依次调用如下这些
最后关键点在于调用getModel()方法
zentao\module\api\control.php
例如这个pauload:http://ip/www/api-getModel-api-sql-sql=select+account,password+from+zt_user
根据getModel方法中的第50行 参数调用大致流程如下:
调用方式为 先调用api模块中的getModel方法然后getModel方法再调用api模块中的sql方法 查询参数为sql=select+account,password+from+zt_user
sql注入
接着上面的 跟进api模块sql方法
zentao\module\api\model.php
sql方法判断查询语句中以select开头则执行查询。
并未做任何安全过滤。导致sql注入
http://ip/www/api-getModel-api-sql-sql=select+account,password+from+zt_user
任意文件读取
本地在xampp\zentao\module\api目录下创建文件123内容为123
复现:http://127.0.0.1/zentao/api-getModel-file-parseCSV-fileName=123
调用流程为:
api模块getModel方法调用file模块parseCSV方法并传入参数fileName=123
直接找到parseCSV方法:
直接将内容写入$content并整理输出。
linux可直接读取/etc/passwd,windows为什么不能读取带有后缀的文件呢?比如:C:/windows/win.ini
因为下面的parsePathInfo()函数将路径处理了:
rce
复现:
先将phphinfo写入文件bote
http://ip/zentao/api-getModel-editor-save-filePath=bote
然后利用文件包含导致命令代码执行。
http://ip//zentao/api-getModel-api-getMethod-filePath=bote/1
这次rce由下面两种漏洞组合造成:
1、任意文件写入
根据payload:api-getModel-editor-save-filePath=bote
调用editor模块将filePath=bote 传入save方法
直接找到save方法 ,解释写在图片注释中
zentao\module\editor\model.php
2、文件包含
根据payload:api-getModel-api-getMethod-filePath=bote/1
调用api模块getMethod方法。
注意:$fileName = dirname($filePath); 是返回目录路径 例:/tmp/bote/1.txt 返回:/tmp/bote
所以payload需要再包一层目录。
然后进入zentao\framework\base\helper.class.php , import方法 进行文件包含