JSON Web Token (JWT) Vulnerabilities
Concept
Vulnerable Scenario
Example Code (Vulnerable)
import jwt
from flask import Flask, request, jsonify
app = Flask(__name__)
app.config['SECRET_KEY'] = 'weak-secret-key'
@app.route('/login', methods=['POST'])
def login():
username = request.json.get('username')
password = request.json.get('password')
if authenticate_user(username, password):
payload = {'username': username, 'role': 'admin'}
token = jwt.encode(payload, app.config['SECRET_KEY'], algorithm='HS256')
return jsonify({'token': token})
else:
return jsonify({'message': 'Invalid credentials'}), 401
@app.route('/protected', methods=['GET'])
def protected():
token = request.headers.get('Authorization')
if token:
try:
payload = jwt.decode(token, app.config['SECRET_KEY'], algorithms=['HS256'])
username = payload['username']
return jsonify({'message': f'Welcome, {username}!'})
except jwt.ExpiredSignatureError:
return jsonify({'message': 'Token has expired'}), 401
except jwt.InvalidTokenError:
return jsonify({'message': 'Invalid token'}), 401
else:
return jsonify({'message': 'Token is missing'}), 401
if __name__ == '__main__':
app.run()Explanation
Prevention
Example Code (Secure)
Conclusion
Semgrep Rule
Last updated