齐博全版本getshell漏洞

对齐博cms最新漏洞的探讨

Author:0day5
Email:nophacker@gmail.com
Blog:http://www.0day5.com

起初,这套程序是我在和小伙伴一边看CCAV一边拿着爪机和妹子微信的时候。基友redrain提醒我看的。说是齐博出了重大的漏洞,发布了紧急补丁。然后就陪好基友redrain一起分析了这个漏洞的产生过程。

0x01 变量覆盖
do/fujsarticle.php
[php]
$FileName=dirname(__FILE__)."/../cache/fujsarticle_cache/";
if($type=='like'){ //只有type=like时候才触发
$FileName.=floor($id/3000)."/";
}else{
unset($id);
}
.........省略部分代码
require_once(dirname(__FILE__)."/global.php"); //重新加载该文件
.........省略部分代码
foreach($listdb AS $key=>$rs)
{
//$target=$rs[target]?'_blank':'_self';
$target='_blank';
if($type=='pic'){
$show.="

";
}else{
eval("\$show.=\"$tplcode\";");
}
}
if(!$show){
$show="暂无...";
}
[/php]

由于重新加载了global.php。所以前面的FileName对get变量再次extract。对FileName可控,就达到了覆盖文件的可能。
比如我们提交
http://www.0day5.com/do/fujsarticle.php?type=like&FileName=../data/1.php&submit=fuck
会由于条件不满足,打印出 1.php
[php][/php]

这里可以造成对任意文件的覆盖和生成,但是内容不可控。

0x02 代码执行
在文件do/jf.php
[php]
$query = $db->query("SELECT * FROM {$pre}jfsort ORDER BY list");
while($rs = $db->fetch_array($query)){
$fnameDB[$rs[fid]]=$rs[name];
$query2 = $db->query("SELECT * FROM {$pre}jfabout WHERE fid='$rs[fid]' ORDER BY list");
while($rs2 = $db->fetch_array($query2)){
eval("\$rs2[title]=\"$rs2[title]\";");
eval("\$rs2[content]=\"$rs2[content]\";");
$jfDB[$rs[fid]][]=$rs2;
}
}[/php]
从xx_fjabout里面读取的title和content都被执行了。所以控制好title和content就能够执行任意代码了。
参考
http://phpchallenges2.sinaapp.com/index.php

0x03 双剑合并
这个是造成对getshell的主要原因了。将上面两个漏洞结合起来,就达到了覆盖文件, 然后提交远程数据,控制title和content来执行。

感谢三位好基友hellolove ZTZ redrain

4 条评论

  1. tesrt

    为什么要复写mysq_config.php??必要条件?
    由于重新加载了global.php。所以前面的FileName对get变量再次extract。
    这句话是触发的哪个文件的extract?

    1. qibo
      @tesrt

      第二步看不懂啊,大牛给个EXP吧谢谢

  2. X谁谁怀孕

    :evil: 有没有exp呢,这样看不太懂呢

    1. 0day5
      @X谁谁怀孕

      仔细看下就懂了的

发表评论