Источник: https://github.com/AnaktaCTF/CTF/blob/main — WEB/JSON Injection.md
Что такое JSON Injection?
JSON-инъекция — это тип атаки, при которой злоумышленник пытается внедрить вредоносные данные в структуру JSON, которая затем используется веб-приложением для выполнения операций, таких как обработка запросов, сохранение данных или принятие решений. Это может привести к изменениям в поведении приложения и его логике, утечке конфиденциальной информации, а также возможности выполнить произвольный код.
Инъекция происходит, когда приложение недостаточно проверяет или очищает входные данные перед тем, как они будут вставлены в структуру JSON, а затем эти данные передаются в другие компоненты системы (например, сервер, база данных, или другие части приложения). Злоумышленник может манипулировать такими данными для достижения своих целей, используя различные способы и уязвимости.
Как это работает:
-
Ввод данных пользователем - приложение получает данные от клиента (например, через форму, URL или API-запрос).
-
Обработка данных - эти данные затем могут быть вставлены в структуру JSON для дальнейшей обработки на сервере или клиенте.
-
Внедрение инъекции - если входные данные не валидируются или не экранируются должным образом, злоумышленник может вставить вредоносные данные. Эти данные могут изменить логику работы приложения или использоваться для выполнения нежелательных операций.
Примеры атак JSON-инъекции
Изменение логики работы приложения
Например, злоумышленник может попытаться изменить параметры запроса или данные, отправленные серверу, чтобы изменить их значения и воздействовать на логику работы приложения.
Рассмотрим веб-приложение, которое обрабатывает JSON-объект с ролями пользователей:
{
"user": "john_doe",
"role": "user"
}
Если приложение не проверяет, какие значения роли допустимы, злоумышленник может попытаться инжектировать роль "admin":
{
"user": "john_doe",
"role": "admin"
}
Это может позволить злоумышленнику получить доступ к защищенным частям приложения, предназначенным только для администраторов.
Утечка конфиденциальных данных
При неправильной обработке данных, инъекция может привести к утечке конфиденциальной информации. Например, если приложение не проверяет, какие данные передаются через JSON, злоумышленник может вставить параметры, которые позволяют ему получить доступ к чувствительным данным.
Злоумышленник может внедрить запрос, который раскрывает всю информацию о пользователе
{
"user": "john_doe",
"data_request": "all_user_data"
}
В результате приложение может вернуть конфиденциальные данные, такие как имя, адрес, историю покупок и другие личные сведения, которые злоумышленник не должен был бы видеть.
Возможность выполнения произвольного кода
В некоторых случаях внедрение вредоносных данных в структуру JSON может привести к тому, что приложение выполнит небезопасный код. Это особенно актуально для приложений, которые обрабатывают данные в формате JSON и используют их в качестве параметров для выполнения серверных или клиентских операций (например, выполнение скриптов или команд).
Если приложение не фильтрует или экранирует входные данные должным образом, злоумышленник может инжектировать код JavaScript:
{
"user": "john_doe",
"role": "admin",
"script": "<script>alert('Hacked!');</script>"
}
Это может привести к атаке XSS (Cross-Site Scripting), если приложение использует эти данные для отображения на веб-странице без должной фильтрации.
Как JSON-инъекция может повлиять на систему
- Изменение логики приложения
Когда злоумышленник может манипулировать параметрами JSON, это дает ему возможность изменять логику работы приложения. Это может привести к несанкционированному доступу, изменению пользовательских ролей или выполнению нежелательных действий от имени других пользователей.
- Утечка конфиденциальной информации
Если приложение неправильно фильтрует или проверяет вводимые данные, злоумышленники могут запросить данные, которые не должны быть доступны. Это может включать личные данные пользователей, пароли или даже служебную информацию, такую как данные о серверах и настройках.
- Выполнение произвольного кода
В случае, когда данные передаются и исполняются как код, инъекция может привести к выполнению произвольного JavaScript, серверных команд или даже удаленной загрузки и исполнения вредоносного ПО. Это особенно опасно в веб-приложениях, где JSON часто используется для обмена данными между сервером и клиентом.
Виды JSON-инъекций
JSON-инъекции могут принимать разные формы в зависимости от того, как данные передаются между клиентом и сервером, и где именно злоумышленник пытается внедрить свои данные. Рассмотрим три основных типа JSON-инъекций
- Инъекции через параметры URL
Когда данные передаются через URL-запросы и затем внедряются в структуру JSON, это создаёт уязвимость, если приложение не фильтрует или не экранирует данные, полученные из URL. Приложение может использовать параметры URL, переданные в запросах, для формирования JSON-ответов или запросов.
Пример атаки через параметры URL:
Предположим, веб-приложение принимает данные через URL в виде параметров:
GET /updateProfile?user=john_doe&role=user
Если приложение не проверяет значения, переданные в user и role, злоумышленник может изменить запрос следующим образом:
GET /updateProfile?user=john_doe&role=admin
В этом случае злоумышленник может попытаться получить доступ к разделам приложения, которые доступны только администраторам. При отсутствии должной проверки на стороне сервера такие изменения могут привести к уязвимостям, таким как повышение привилегий.
- Инъекции через формы
Когда данные передаются через формы, например, в POST-запросах, и эти данные затем внедряются в структуру JSON. Веб-приложения часто используют формы для сбора данных от пользователей, которые затем обрабатываются и могут быть включены в JSON-ответ. Если форма не валидает и не фильтрует введенные данные, злоумышленники могут внедрить нежелательные или вредоносные данные.
Пример атаки через формы:
<form action="/update" method="POST">
<input type="text" name="username" value="john_doe">
<input type="text" name="role" value="user">
<input type="submit" value="Update">
</form>
Если приложение не проверяет введенные данные, злоумышленник может вручную отправить данные, включающие нежелательные значения:
<form action="/update" method="POST">
<input type="text" name="username" value="hacker">
<input type="text" name="role" value="admin">
<input type="submit" value="Update">
</form>
В случае успешной инъекции роль пользователя будет изменена на admin, что может привести к обходу механизма авторизации и доступу к защищенным ресурсам.
- Инъекции в API-запросы
API-запросы часто используют данные в формате JSON для передачи информации между клиентом и сервером. Если API-запросы не валидируют или не фильтруют входные данные должным образом, злоумышленники могут инжектировать вредоносные данные. Эти данные могут повлиять на логику работы API, изменить параметры запроса или повредить ответ, что может привести к выполнению произвольного кода или утечке данных.
Пример атаки через API-запрос:
Предположим, API принимает JSON с параметрами для обновления профиля пользователя:
{
"username": "john_doe",
"role": "user"
}
Если API не проверяет данные, злоумышленник может отправить такой запрос:
{
"username": "hacker",
"role": "admin",
"isAdmin": true
}
Этот запрос может быть использован для изменения роли пользователя и предоставления себе административных прав, что может привести к несанкционированному доступу к ресурсам, требующим прав администратора.
Методы защиты от JSON Injection
Чтобы предотвратить JSON-инъекцию, следует внедрить несколько методов защиты:
Валидация и фильтрация входных данных
Применяйте строгую валидацию всех входных данных перед их включением в JSON. Используйте белые списки (whitelisting) для проверки допустимых значений.
Использование безопасных API
Используйте API, которые проводят проверку данных перед их обработкой, минимизируя возможность инъекции.
Экранирование данных
Все специальные символы в данных, которые передаются через JSON, должны быть экранированы, чтобы избежать интерпретации как части структуры JSON.
Использование цифровых подписей и токенов
Для проверки целостности передаваемых данных используйте цифровые подписи и проверку подписей для предотвращения подмены данных.
Применение принципа наименьших привилегий
Ограничьте права доступа пользователей только необходимыми для выполнения их задач, минимизируя последствия успешных атак.
JSON-инъекция — это опасная угроза для веб-приложений, которая может привести к утечке данных, изменению логики работы или даже выполнению вредоносного кода. Для защиты от этой уязвимости необходимо тщательно проверять и фильтровать входящие данные, использовать безопасные API и эранировать данные перед их обработкой. Правильная защита на всех уровнях поможет уменьшить риски и повысить безопасность приложения.