此过程为某站点的渗透记录,过程一波三折,但归根结底都是粗心大意造成的,不过自我认为在这个排坑的过程中也学习到了很多。
确认版本
首先可以通过接口来确认一下当前禅道的版本。
http://example.com/index.php?mode=getconfig
SQL注入分析
网上之前有过一个9.1.2的orderBy函数的分析,但是没想到9.2.1也存在此问题,(2018.3.2号看到目前最新版本是9.8.1)。
出问题的地方是此文件的orderBy函数:\lib\base\dao\dao.class.php
对于limit后未做严格的过滤与判断,然后拼接到了order by后面导致产生注入.
$order = join(',', $orders) . ' ' . $limit;
看了一下9.8.1的修补是对limit进行正则限制,但是事实上感觉此处正则是写了一个bug,比如正常调用orderBy($order)的时候,其中$order为abc desc limit 1,1的时候,进入$limit则是limit 1,1,导致匹配失败。
如果想要造成前台注入(无需登录)的话,就得先看看禅道开放了哪些接口,看是否有调用orderBy函数。
\zentao\module\common\model.php
其中的if($module == 'block' and $method == 'main') return true;,也就是本次漏洞的主角,继续跟进。
\zentao\module\block\control.php
首先看__construct中,$this->selfCall是在验证referer的值,如果为真的话则后面的if将不会进入die语句里面
接下来跟进main函数,可以看到最后的$func = 'print' . ucfirst($code) . 'Block';,会对一些函数进行调用,与此同时,我们搜索orderBy的调用的时候可以发现printCaseBlock函数的存在
\zentao\module\block\control.php
所以前台注入的整个过程便比较清晰了,那么如何利用?
上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。