禅道 11.6版本 SQL注入漏洞
漏洞描述
禅道 11.6 版本中对用户接口调用权限过滤不完善,导致调用接口执行SQL语句导致SQL注入
影响版本
Note
禅道 11.6
环境搭建
这里使用docker环境搭建
docker run --name zentao_v11.6 -p 8084:80 -v /u01/zentao/www:/app/zentaopms -v /u01/zentao/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d docker.io/yunwisdom/zentao:v11.6访问 http://xxx.xxx.xxx.xxx:8084 按步骤安装即可

漏洞复现
先对禅道的调用流程进行分析,先查看目录为www/index.php首页文件中

这里使用router::createApp创建了一个APP对象
来到framework/base/router.class.php文件查看到createApp方法

这里New了一个对象,查看一下调用方法(348行)

在358行处调用了setConfigRoot方法
在363行处调用了loadMainConfig方法
这里包含了配置文件config.php配置文件,文件目录为/config/config.php
在25行定义了调用方法
可以发现这里存在两种路由PATH_INFO|PATH_INFO2:一种是m、f、t来进行调用。另外一种是通过-来进行调用
在index.php中的66行
看到这一条则是判断力两种调用方法
跟进setRouteByPathInfo方法
所以可以推断出调用的方法
例如登录页面有两种访问方法
再看一下checkPriv方法
这里检测了调用模块和方法的权限,可以知道除了isOpenMethod中定义的公开模块和方法之外,其他的方法都是需要登录的
最后是$app->loadModule();这段代码
通过之前获取的moduleName包含对应的control类文件并实例化,随后调用setParamsByPathInfo方法从路径中获取方法对应的参数值,最后通过call_user_func_array方法调用对应control类中的对应方法并赋值。
我们查看module/api/control.php文件中的getModel方法

这里通过call_user_func_array函数调用所有的model文件的所有方法。
可以看到module/api/moudel.php中的sql函数
这里并没有进行过滤,只使用了代码$sql=trim($sql)过滤了空格
我们看一下这里的调用这个方法需要的权限

这里可以看到任何用户都可以调用这个模块的方法,所以我们用它调用sql方法进行查询(空格转换为+,绕过过滤)

成功执行sql语句
漏洞利用POC
登陆后访问
Last updated
Was this helpful?