워게임을 풀다가 알게 된 취약점에 대해 정리한 내용이다.
Unicode
먼저 Unicode란?
유니코드는 플랫폼, 프로그램 또는 언어에 관계없이 전 세계 쓰기 시스템에서 사용되는 모든 문자에 고유한 숫자 값(코드 포인트)을 제공하는 것을 목표로 하는 문자 인코딩 표준이다.
기본적인 ASCII 범위를 벗어나 전 세계 언어를 표현하기 위해 Unicode를 많이 사용한다. 이로 인해 ASCII로 표현이 불가능했던 문자를 unicode로 표현이 가능해졌다.
이로 인해 예상치 못한 취약점이 발생하곤 하는데 이에 대해 설명하고자 한다.
case mapping collision
우선 Java, Python, Ruby등의 언어에서 소문자 → 대문자, 대문자 → 소문자로 변경하는 함수들이 있을것이다.
(ex. toLowercase, toUppercase, Lower, downcase 등)
우리는 위에 설명한 Unicode를 이용해 영어, 숫자, 특수문자등 다양한 세계의 언어를 입력할 수 있다.
그럼 서버에서는 우리가 입력한 Unicode를 처리하는 과정을 거치는데 그 과정에서의 취약점이 있다.
바로 Unicode와 위에 설명한 함수를 같이 쓰는 것인데
예를 들어, 대문자 K를 소문자로 바꾸면 소문자 k가 되는 것은 당연히 참이다.
혹시 위 두 개의 사진의 차이를 알 수 있는가?
눈으로 보면 둘 다 대문자를 소문자로 변경하는 똑같은 경우로 보이는데
두 번째 사진의 대문자 K는 영어 K가 아니다.
켈빈으로 온도의 단위로 쓰이는 수식 기호 문자이다.
보기 쉽게 Unicode로 비교해 보겠다.
이처럼 영어가 아니지만 소문자, 대문자 변경을 했을 때 영어로 인식되는 취약점을 case mapping collision이라 한다.
if (id.toLowercase == 'korea'){
break;
}
예를 들어 위와 같은 필터링이 걸려 있을 때 id를 '\u212aorea'로 입력 시 우회할 수 있다.
모든 유니코드가 해당되는 것은 아니므로 아래 사이트를 참고하길 바란다.
https://gosecure.github.io/unicode-pentester-cheatsheet/
'Web > 개념정리' 카테고리의 다른 글
[개념정리] Prototype Pollution (0) | 2024.06.05 |
---|---|
[개념정리] PHP Deserialization 취약점 (0) | 2024.05.26 |
[개념정리] Click jacking (0) | 2024.01.05 |
[개념정리] SameSite (0) | 2023.10.27 |
[개념정리] XSS (0) | 2023.08.23 |