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에서 발견되었지만 다른 언어에서도 존재할 수 있습니다. 이러한 문제는 이 블로그 게시물에 게시되었습니다.
Go의 JSON, XML 및 YAML 파서는 인증 우회, 권한 상승 또는 민감한 데이터 유출을 악용할 수 있는 오랜 불일치와 불안전한 기본값의 흔적을 가지고 있습니다.
(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}
✔️ 필드가 (un)marshaled 되는 것을 차단하는 올바른 방법:
type User struct {
IsAdmin bool `json:"-"`
}
파서 차이점
목표는 서로 다른 파서가 동일한 페이로드를 다르게 해석하는 방식을 이용하여 인증을 우회하는 것입니다. 예를 들어:
- CVE-2017-12635: 중복 키를 통한 Apache CouchDB 우회
- 2022: XML 파서 불일치를 통한 Zoom 0-click RCE
- GitLab 2025 SAML 우회 via XML quirks
1. 중복 필드:
Go의 encoding/json
은 마지막 필드를 취합니다.
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction
다른 파서(예: Java의 Jackson)는 첫 번째를 선택할 수 있습니다.
2. 대소문자 구분 없음: Go는 대소문자를 구분하지 않습니다:
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field
유니코드 트릭도 작동합니다:
json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req)
3. 크로스 서비스 불일치: 상상해 보세요:
- Go로 작성된 프록시
- Python으로 작성된 AuthZ 서비스
공격자가 보냅니다:
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
- Python은
UserAction
을 보고 허용합니다. - Go는
AdminAction
을 보고 실행합니다.
데이터 형식 혼란 (폴리글롯)
목표는 형식을 혼합하는 시스템(JSON/XML/YAML)을 악용하거나 파서 오류에서 열려 있는 상태로 실패하는 시스템을 악용하는 것입니다:
- CVE-2020-16250: HashiCorp Vault는 STS가 XML 대신 JSON을 반환한 후 XML 파서를 사용하여 JSON을 파싱했습니다.
공격자가 제어하는 것:
Accept: application/json
헤더- JSON 본문의 부분적 제어
Go의 XML 파서는 어쨌든 이를 파싱하고 주입된 신원을 신뢰했습니다.
- 조작된 페이로드:
{
"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"
을 파싱
🔐 완화 조치
위험 | 수정 |
---|---|
알 수 없는 필드 | decoder.DisallowUnknownFields() |
중복 필드 (JSON) | ❌ 표준 라이브러리에 수정 없음 |
대소문자 구분 없는 일치 | ❌ 표준 라이브러리에 수정 없음 |
XML 쓰레기 데이터 | ❌ 표준 라이브러리에 수정 없음 |
YAML: 알 수 없는 키 | yaml.KnownFields(true) |
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을 제출하여 해킹 트릭을 공유하세요.