Привет, через несколько месяцев я был занят работой, изучаю новые вещи и выполняю хакерские задачи. Я чувствую, что этим знанием нужно поделиться :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 и другие соображения безопасности. Спасибо