MENU

某流控后台getshell

November 22, 2019 • PHP,代码审计

[hplayer media="netease" id="430685732" type="song" size="large" auto="false" /]

后台getshell

朋友发来一个站让帮忙getshell一下,打开看了看,没有上传的地方,也没有看到文件包含什么的功能点。随后就在git上搜了下关键词,找到了源码看了看。

漏洞位置:admin/user_create.php line 4-34

if($_GET['act'] == 'add'){
        $pass = trim($_POST["password"]);
        if($pass == ""){
            tip_failed("密码长度不能为空",'?');
        }else{
            $db = db(_openvpn_);
            $n = 0;
            for($i=0;$i<$_POST["nums"];$i++){
                $passstr = null;
                for($i2=0;$i2<$pass;$i2++){
                    $passstr .= rand(0,9);
                }
                $username = $_POST['username'].rand(10000,99999).$i;
                if(!$db->where(array("iuser"=>$username))->find()){ //禁止重复添加 
                    if($db->insert(array(
                        'iuser'=>$username,
                        'pass'=>$passstr,
                        'i'=>$_POST['i'],
                        'isent'=>0,
                        'irecv'=>0,
                        'maxll'=>$_POST['rate']*1024*1024,
                        'starttime'=>time(),
                        'endtime'=>time()+$_POST['days']*24*60*60
                    ))){
                        $kms[] = '$data['.$n.']["user"]="'.$username.'";';
                        $kms[] = '$data['.$n.']["pass"]="'.$passstr.'";';
                        $n++;
                    }
                }
            }
        }
            
            file_put_contents("lastkm/userdata.php",'<?php'."\n".implode("\n",$kms));
            tip_success("成功!",'lastkm/user.php');

    }else{
    $action = "?act=add";

流程:

  1. get方式获取act的参数值为add即可进入分支
  2. post传入的password参数值不为空
  3. 此处是批量生成用户的功能,在11-32生产随机密码和随机用户名
  4. 最后写入到lastkm/userdata.php文件中

触发点在于16行的username变量直接接受了post传入的值与后面的随机数进行拼接,然后写入到数据库中。从这段代码来看是直接接受没有进行任何过滤的,其实在传入过来后会自动进行一次html实体编码。

在36行 可以看到执行了写入文件操作,写入的内容是$kms


写入到php文件中的内容大致为:

<?php
$data['0']["user"]="$username.xxx";
$data['0']["passs"]="xxx";


php在双引号中是可以解析变量的,正是这里出现了问题。虽然使用了实体编码,想让我们无法闭合"执行其他的php语句,但是我们可以通过${@{function}}的形式无须闭合即可执行相应的命令。

利用过程