askanton

OWASP Top 10 — A02:2021 Cryptographic Failures

Jul 15th, 2025
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.67 KB | None | 0 0
  1. from flask import Flask, request, redirect, render_template_string, session, url_for
  2. import jwt
  3. import hashlib, base64
  4.  
  5. app = Flask(__name__)
  6. app.secret_key = 'secret'
  7. JWT_SECRET = 'myjwtsecret'
  8.  
  9. users = {
  10.     "admin": {"password": "admin123", "role": "admin"},
  11.     "alice": {"password": "alice123", "role": "user"},
  12.     "bob": {"password": "bob123", "role": "user"}
  13. }
  14.  
  15. login_template = '''
  16. <h2>Login</h2>
  17. <form method="POST">
  18.  <input name="username" placeholder="Username"><br>
  19.  <input name="password" placeholder="Password" type="password"><br>
  20.  <button type="submit">Login</button>
  21. </form>
  22. '''
  23.  
  24. protected_template = '''
  25. <h2>Welcome, {{ username }} ({{ role }})</h2>
  26. <p>Your JWT token:</p>
  27. <code>{{ token }}</code><br>
  28. <p>MD5 password hash: <code>{{ password_hash }}</code></p>
  29. <p>Password base64: <code>{{ password_base64 }}</code></p>
  30. <br>
  31. <a href="/logout">Logout</a>
  32. '''
  33.  
  34. @app.route('/', methods=["GET"])
  35. def home():
  36.     return redirect(url_for('login'))
  37.  
  38. @app.route('/login', methods=["GET", "POST"])
  39. def login():
  40.     if request.method == "POST":
  41.         username = request.form.get('username')
  42.         password = request.form.get('password')
  43.         user = users.get(username)
  44.  
  45.         if user and user["password"] == password:
  46.             token = jwt.encode({"user": username, "role": user["role"]}, JWT_SECRET, algorithm="HS256")
  47.             session['token'] = token
  48.             return redirect(url_for('protected'))
  49.         else:
  50.             return "Invalid credentials", 403
  51.     return render_template_string(login_template)
  52.  
  53. @app.route('/protected')
  54. def protected():
  55.     auth_header = request.headers.get('Authorization')
  56.     token = session.get('token')
  57.  
  58.     if auth_header and auth_header.startswith("Bearer "):
  59.         token = auth_header.split(" ")[1]
  60.  
  61.     if token:
  62.         try:
  63.             decoded = jwt.decode(token, JWT_SECRET, algorithms=["HS256", "none"], options={"verify_signature": False})
  64.             username = decoded.get("user")
  65.             role = decoded.get("role")
  66.             password = users.get(username, {}).get("password", "unknown")
  67.             password_hash = hashlib.md5(password.encode()).hexdigest()
  68.             password_base64 = base64.b64encode(password.encode()).decode()
  69.             return render_template_string(protected_template, username=username, role=role, token=token, password_hash=password_hash, password_base64=password_base64)
  70.         except Exception as e:
  71.             return f"Invalid token: {e}", 403
  72.  
  73.     return redirect(url_for("login"))
  74.  
  75. @app.route('/logout')
  76. def logout():
  77.     session.clear()
  78.     return redirect(url_for('login'))
  79.  
  80. if __name__ == "__main__":
  81.     app.run(debug=True)
  82.  
Add Comment
Please, Sign In to add comment