Статья Тестирование одного интересного REST API на безопасность.

The_cloud_inside_the_API_label_--ar_13235_--v_5.2.png


Приветствую всех читателей форума.
Сегодня я буду тестировать инстанс одного интересного приложения под названием "Vampi", любезно предоставленным @szybnev.
Приложение включает в себя уязвимости из OWASP API Security Top 10.
В статье будут подсвечены такие действия как:

- Чрезмерная уязвимость данных
- Несанкционированная смена пароля
- Mass Assigment
- SQL инъекция
- Неработающая авторизация на уровне объекта


Начинаем с разведки, сканируем приложение с помощью сканера Nuclei и находим там интересный файл:

Окно переполнения области задач._240718153227.png

Этот файл openapi.json содержит описание структуры и функциональности API, включая конечные доступные точки, параметры запросов и другую информацию.
Открыв его мы понимаем какие у нас есть эндпоинты и куда мы можем обращаться.
Основные ручки за которые мы будем дергать это :
/users/v1/_debug
/users/v1/login
/users/v1/register
/users/v1/{username}
/users/v1/{username}/password
/books/v1
/books/v1/{book_title}



Основная часть.
Этот API endpoint "/users/v1/_debug" позволяет получить подробности о пользователях.
Screenshot_2.png


Попробуем обратиться к нему через Burp Suite :
Окно переполнения области задач._240718165719.png


Основной момент:
Чрезмерный доступ: Если конечные точки отладки оставлены и не ограждены механизмами аутентификации и авторизации,
это может привести к несанкционированному доступу, что повышает уязвимость приложения.
В спецификации OpenAPI этого параметра нет, по этому всегда стоит проверять это самому.

Если обратимся openapi.json , то понимаем как работает авторизации в приложении:
Здесь используется токен в формате JWT при доступе к ресурсам API.
Screenshot_3.png



Несанкционированная смена пароля
У нас есть конечная точка, которая дает возможность смены пароля:
Screenshot_6.png


При входе в систему получаем токен, который у каждого пользователя свой.
Окно переполнения области задач._240718150035.png


Попробуем изменить пароль юзера name2 с токеном пользователя name1.
Устанавливаем в хедер токен Authorization и успешно меняем пароль.
Окно переполнения области задач._240718151106.png


Проверяем это:
Окно переполнения области задач._240731192916.png


Проблема заключается в следующем:
Если код использует имя пользователя, полученное из URL, для обновления пароля, злоумышленник может отправить запрос
на изменение пароля для чужого аккаунта, если он знает имя пользователя.
Это происходит потому, что отсутствует валидация прав доступа или аутентификация пользователя, который пытается изменить пароль.

Python:
user = User.query.filter_by(username=username).first()
user.password = request_data.get('password')
db.session.commit()

Mass Assigment
123.jpg


Так же в начале при обращении к debug заметил интересную деталь, где передается значение admin=true или admin=false.
Попробуем зарегистрировать юзера с правами администратора.
Окно переполнения области задач._240718160723.png


Мы успешно сделали это. И теперь мы можем использовать токен на действия с правами администратора.

В этой уязвимости разработчик оставил возможность для обычного пользователя зарегистрироваться как администратор,
просто добавив лишний параметр в тело запроса. На это стоит обращать внимание и проверять это.

- SQL инъекция
Если покопаться еще в приложении в url параметре одного из юзеров, поставив кавычку , то мы получим ошибку, которая
дает возможность проверить такую атаку как SQL Injection.
Окно переполнения области задач._240718163143.png


Воспользуемся инструментом sqlmap:
Окно переполнения области задач._240718174437.png


Python:
user_query = f"SELECT * FROM users WHERE username = '{username}'"
query = db.session.execute(user_query)
ret = query.fetchone()

Основные проблемы кода:

1. Неэкранированные данныx.
2. Использование методов execute с неочищенными данными.

Python:
# Параметризованный запрос для безопасности
user_query = "SELECT * FROM users WHERE username = :username"
query = db.session.execute(user_query, {"username": username})

ret = query.fetchone()

Неработающая авторизация на уровне объекта
У приложения есть функционал для получения предмета (книги) по пути /books/v1.
А так же извлечение книги и просмотр содержимого /books/v1/{book_title}.
Screenshot_7.png
Screenshot_8.png
Screenshot_9.png
Screenshot_10.png


Разработчик не указал в запросе к базе данных имя пользователя, который запрашивает книгу. В результате, книга
с секретной информацией может быть извлечена любым пользователем, имеющим действующий токен Bearer.
Окно переполнения области задач._240719160213.png


В первом варианте уязвимый код, во втором код делает то же самое, но с дополнительным условием. Он ищет книгу, которая
принадлежит определённому пользователю (user).

Python:
Vulnerable Case
book = Book.query.filter_by(book_title=str(book)).first()

Proper Case
book = Book.query.filter_by(user=user, book_title=str(book)).first()

В данной статье описаны не все техники которые могут использоваться в данном приложении, я осветил лишь те которые мне понравились больше всего.

Вывод :
Все это в совокупности является серьезными уязвимостями, которые могут возникнуть в приложениях REST API и представляют угрозу для
безопасности пользователей и данных.

Для обеспечения безопасности приложения REST API необходимо активно наблюдать за этими угрозами, реализуя соответствующие меры защиты, такие как аутентификация и авторизация пользователей, фильтрация входных данных, использование параметризованных запросов для предотвращения SQL инъекций и продуманное управление доступом к данным. Только таким образом можно обеспечить надежную защиту от потенциальных атак и утечек данных.

Всем спасибо за внимание! Надеюсь, информация была полезной и интересной. Если у вас есть вопросы или идеи, делитесь ими в комментариях.
 

Вложения

  • Screenshot_1.png
    Screenshot_1.png
    35,7 КБ · Просмотры: 27
  • Окно переполнения области задач._240718144025.png
    Окно переполнения области задач._240718144025.png
    26,9 КБ · Просмотры: 21
  • Окно переполнения области задач._240718141021.png
    Окно переполнения области задач._240718141021.png
    36,3 КБ · Просмотры: 22
  • Окно переполнения области задач._240718151424.png
    Окно переполнения области задач._240718151424.png
    21,3 КБ · Просмотры: 71
  • Окно переполнения области задач._240718155714.png
    Окно переполнения области задач._240718155714.png
    18,3 КБ · Просмотры: 20
  • Окно переполнения области задач._240718160530.png
    Окно переполнения области задач._240718160530.png
    19 КБ · Просмотры: 21
  • Окно переполнения области задач._240718161537.png
    Окно переполнения области задач._240718161537.png
    17,5 КБ · Просмотры: 18
  • Окно переполнения области задач._240718163658.png
    Окно переполнения области задач._240718163658.png
    107,6 КБ · Просмотры: 21
  • Окно переполнения области задач._240718163658.png
    Окно переполнения области задач._240718163658.png
    107,6 КБ · Просмотры: 19
  • Окно переполнения области задач._240718163658.png
    Окно переполнения области задач._240718163658.png
    107,6 КБ · Просмотры: 22
  • Screenshot_5.png
    Screenshot_5.png
    9,8 КБ · Просмотры: 21
  • Screenshot_6.png
    Screenshot_6.png
    12,4 КБ · Просмотры: 21
  • Окно переполнения области задач._240731192741.png
    Окно переполнения области задач._240731192741.png
    19,6 КБ · Просмотры: 22
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!