Привет, через несколько месяцев я был занят работой, изучаю новые вещи и выполняю хакерские задачи. Я чувствую, что этим знанием нужно поделиться :D
чем на самом деле вы хотите поделиться по этим темам?.. ну, некоторые из вас должны изменить свою точку зрения на то, как вы выглядите при кодировании base64 после прочтения этого. почему?.. потому что у меня есть тот же опыт, что вы хотите, чтобы узнать сегодня!
Если вы хотите узнать о токене JWT и о том, как его использовать?.. Нет, не в этой статье. Но вы можете сослаться на ссылку, которой я делюсь ниже, это правильное руководство для вас.
1 Вики Ли (https://medium.com/swlh/hacking-json-web-tokens-jwts-9122efe91e4a)
2. https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/
#!/usr/bin/env python3 # -*- coding: utf-8 -*- from flask import Flask, request, jsonify from flask_jwt_extended import JWTManager, jwt_required, create_access_token, decode_token import datetime from apscheduler.schedulers.background import BackgroundScheduler import threading import jwt from config import * # Setup flask app = Flask(__name__) app.config['JWT_SECRET_KEY'] = SECRET jwtmanager = JWTManager(app) blacklist = set() lock = threading.Lock() # Free memory from expired tokens, as they are no longer useful def delete_expired_tokens(): with lock: to_remove = set() global blacklist for access_token in blacklist: try: jwt.decode(access_token, app.config['JWT_SECRET_KEY'],algorithm='HS256') except: to_remove.add(access_token) blacklist = blacklist.difference(to_remove) @app.route("/web-serveur/ch63/") def index(): eturn "POST : /web-serveur/ch63/login <br>\nGET : /web-serveur/ch63/admin" # Standard login endpoint @app.route('/web-serveur/ch63/login', methods=['POST']) def login(): try: username = request.json.get('username', None) password = request.json.get('password', None) except: return jsonify({"msg":"""Bad request. Submit your login / pass as {"username":"admin","password":"admin"}"""}), 400 if username != 'admin' or password != 'admin': return jsonify({"msg": "Bad username or password"}), 401 access_token = create_access_token(identity=username,expires_delta=datetime.timedelta(minutes=3)) ret = { 'access_token': access_token, } with lock: blacklist.add(access_token) return jsonify(ret), 200 # Standard admin endpoint @app.route('/web-serveur/ch63/admin', methods=['GET']) @jwt_required def protected(): access_token = request.headers.get("Authorization").split()[1] with lock: if access_token in blacklist: return jsonify({"msg":"Token is revoked"}) else: return jsonify({'Congratzzzz!!!_flag:': FLAG}) if __name__ == '__main__': scheduler = BackgroundScheduler() job = scheduler.add_job(delete_expired_tokens, 'interval', seconds=10) scheduler.start() app.run(debug=False, host='0.0.0.0', port=5000)
Я показал вам исходный код, что он делает… вам нужно получить токен API в формате JWT и войти с его помощью. Но препятствие здесь в том, что когда вы генерируете токен, он автоматически попадает в черный список. Затем во время входа в систему выполняется действие, оно проверяет наш JWT с установленным черным списком. Теперь практическое время.
Теперь наше исследование admin API завершено.
Теперь мы находимся на грани тестирования, поэтому давайте посмотрим на токен JWT, есть ли какая-то часть, которой мы можем манипулировать. На случай тестирования: D, просто хочу осветить некоторые методы манипулирования JWT.
Теперь второй трюк, который мы можем использовать, — это слабый секретный ключ JWT. Вы можете попробовать брутфорс со списком слов. Если повезет, мы можем получить секрет. В этом случае мне не удалось получить секрет с помощью списка слов Rockyou.
https://github.com/aress31/jwtcat
Что, если мы поместим отступы в токен JWT? Это можно пройти?. возьмем один пример.
Причина почему? , Если мы изменим какую-то часть заголовка и полезной нагрузки, подпись тоже изменится!
Теперь мы выполнили все возможные тестовые примеры, ни один из них не работает :( .Что мы можем теперь сделать?.. это RFC (запрос на комментарии)!!! >"rfc3548". Часть, которая нас интересует, находится в разделе 8, соображения безопасности.
что значит, что если мы поместим не-алфавит на нашу базу 64?.. его можно пройти?..
Теперь нам удалось обойти это!! Поздравляем. Но есть ли другой способ обойти это?.. да :D
Во-первых, вам нужно сгенерировать токен администратора, пока наша подпись не будет иметь подчеркивание «_», а затем заменить на «/», как на изображении 26 и 27.
Последний метод, который я сохранил, потому что я хочу показать вам другой метод. На самом деле вы можете решить, добавив «=» к нашей подписи.
Что касается заключения, вы изучите методологию тестирования, технику внедрения JWT «нет» и взлом слабого секретного ключа JWT. Наконец, поведение base64 и другие соображения безопасности. Спасибо