从SQL注入到Getshell:记一次禅道系统的渗透

发表于:2018-3-13 11:54

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:L3m0n    来源:长亭安全课堂

  此过程为某站点的渗透记录,过程一波三折,但归根结底都是粗心大意造成的,不过自我认为在这个排坑的过程中也学习到了很多。
  确认版本
  首先可以通过接口来确认一下当前禅道的版本。
  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),我们将立即处理。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号