第十六届蓝桥杯大赛—软件赛网络安全赛项解题过程

Administrator
发布于 2025-04-26 / 57 阅读
1
0

1.情报收集

1.1.黑客密室逃脱

按照题目中的要求访问各个页面中的信息,找到输出的密钥,同时找到加密的代码如下L

随后通过爆破和猜测找到了本题目的核心代码app.py文件

import os
from flask import Flask, request, render_template
from config import *
# author: gamelab

app = Flask(__name__)

# 模拟敏感信息
sensitive_info = SENSITIVE_INFO

# 加密密钥
encryption_key = ENCRYPTION_KEY

def simple_encrypt(text, key):
    encrypted = bytearray()
    for i in range(len(text)):
        char = text[i]
        key_char = key[i % len(key)]
        encrypted.append(ord(char) + ord(key_char))
    return encrypted.hex()

encrypted_sensitive_info = simple_encrypt(sensitive_info, encryption_key)

# 模拟日志文件内容
log_content = f"用户访问了 /secret 页面,可能试图获取 {encrypted_sensitive_info}"

# 模拟隐藏文件内容
hidden_file_content = f"解密密钥: {encryption_key}"

# 指定安全的文件根目录
SAFE_ROOT_DIR = os.path.abspath('/app')
with open(os.path.join(SAFE_ROOT_DIR, 'hidden.txt'), 'w') as f:
    f.write(hidden_file_content)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/logs')
def logs():
    return render_template('logs.html', log_content=log_content)

@app.route('/secret')
def secret():
    return render_template('secret.html')

@app.route('/file')
def file():
    file_name = request.args.get('name')
    if not file_name:
        return render_template('no_file_name.html')
    full_path = os.path.abspath(os.path.join(SAFE_ROOT_DIR, file_name))
    if not full_path.startswith(SAFE_ROOT_DIR) or 'config' in full_path:
        return render_template('no_premission.html')
    try:
        with open(full_path, 'r') as f:
            content = f.read()
        return render_template('file_content.html', content=content)
    except FileNotFoundError:
        return render_template('file_not_found.html')

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')

随后根据代码中的SAFE_ROOT_DIR找到密钥

其中核心代码为中间加解密部分,通过替换和等方法,得到如下的代码:

def simple_encrypt(sensitive_info, sensitive_info):
    encrypted = bytearray()
    for i in range(len(text)):
        char = text[i]
        key_char = key[i % len(key)]
        encrypted.append(ord(char) + ord(key_char))
    return encrypted.hex()

“d9d1c4d9e0ab8fcf97dc626b6b62a8ca97a992a8c1a09ca66999696da09996a4c8ab919f97de656d6cb2” = simple_encrypt(sensitive_info, sensitive_info)

最终得到解密代码如下

def simple_decrypt(encrypted_hex, key):
    encrypted = bytearray.fromhex(encrypted_hex)
    decrypted = []
    for i in range(len(encrypted)):
        key_char = key[i % len(key)]
        original_char = encrypted[i] - ord(key_char)
        decrypted.append(chr(original_char))
    return ''.join(decrypted)

encrypted_hex = "d9d1c4d9e0ab8fcf97dc626b6b62a8ca97a992a8c1a09ca66999696da09996a4c8ab919f97de656d6cb2"
secret_key = "secret_key1575"

sensitive_info = simple_decrypt(encrypted_hex, secret_key)
print(sensitive_info)

2.数据分析

2.1.ezEvtx

根据题目意思找到访问文件的id直接找到唯一结果

2.2.flowzip

直接使用NetS工具,自动化找到流字节中的flag

3.密码破解

3.1.Enigma

原汤化原食,直接使用给定的参数化解即可。

4.逆向分析

4.1.ShadowPhases

本题是一个经典的if-else试题,直接通过动态调试找出代码中的str2在内存中的flag值(ps:当然了逆向代码也没什么不好只是容易掉头发)

5.漏洞挖掘分析

5.1.星际XML解析器

本题目考察对于XML注入的掌握,直接使用常用的XML注入方法对本题目实时注入


评论