Everything is hacked.

There is no 100 % security.

Training/BugBountyClub

Encoding

Kai_HT 2023. 9. 14. 18:00

드라마 "유령" 내 시그니처 로고

Encoding Concept

인코딩은 특정 한 형식의 데이터를 다른 형식으로 변환하는 기술이나 과정을 의미한다.
모의해킹 컨설팅을 진행하면 해당 용어를 당연하게 사용하는데, 해당 용어는 Character Encoding 으로 문자 인코딩을 의미한다.

문자인코딩, Character Encoding 은 사용자가 입력한 문자나 기호들을 컴퓨터가 이용할 수 있는 신호로 만드는 것을 뜻 한다.

인코딩과 반대로 "Decoding - 디코딩" 이라는 용어도 존재하는데 디코딩은 인코딩 형식을 본래 형식으로 변환하는 기술이나 과정을 의미한다.

사용 이유

초반 웹 어플리케이션 환경에서 ASCII 코드 기반 알파벳 또는 일부 특수문자가 아닌 문자를 표기해야하는 요구사항이 존재하지 않았으나, 인터넷의 배포로 사용자가 많아지며 다국어 문자 등을 일관되게 표기해야하는 요구 사항이 발생했다.
해당 요구 사항에 따라서 여러 인코딩 기법이 개발되었으며 또 사라졌다.

인코딩 종류

URL Encoding

URL 인코딩은 URL 상 문자 표현을 위해 사용되는 기법이다. URL 인코딩 형식은 '%' 문자 바로 뒤에 16진수 ASCII 문자를 붙힌 형태로 사용된다.

이름과 같이 URL 내 문자열은 ASCII 문자만 이용할 수 있어 ASCII 문자 이외 특수문자가 포함되는 경우는 인코딩이 필요하며 URL 내 사용되는 예약 문자의 경우 URL 구조를 식별하는 등의 중요 문법적 의미를 갖는 구분자로 이용되니 해당 예약 문자와 충돌 없이 문자의 사용을 위해 인코딩이 필요하다.
→ 한글과 한자는 Unicode (유니코드)를 사용하는데 ASCII 문자만을 URL에서 이용이 가능하므로 유니코드를 ASCII 코드로 변환하여 사용하는데 이를 Punycode 라고 부르며 사용한다.
─→ www.메롱.kr  : www.xn--op2bn8a.kr

! # $ & ' ( ) * + , / : ; = ? @ [ ]
%21 %23 %24 %26 %27 %28 %29 %2A %2B %2C %2F %3A %3B $3D %3F %40 %5B %5D

예약문자
NULL 문자의 경우 %00 이라 추가로 작성하지 않음.

Double Encoding

이중 인코딩은 해당 이름이 가지는 그대로 웹 서버와 웹 어플리케이션에서 각각 URL 디코딩을 수행하는 경우 입력 값을 두 번 URL 인코딩 하는 것을 의미한다.
ex. SPACE-CHARACTER → %20 → %2520

HTML Encoding

HTML 문서는 및 등의 특수 기능에 이용되는 문자들이 포함되는데, 해당 문자가 임의 이용자에 의하여 입력 값으로 포함되어 HTML 문서 내 평문으로 노출되는 경우 XSS, CSRF 등 공격에 노출될 수 있다. 이를 방지하여 HTML 문서 내 안전하게 표시하기 위해 이용하게 되는 인코딩 방식이 HTML Encoding 이다.

  • " : "
  • ' : '
  • & : &
  • : <
  • : >
  •    :  

Base64 Encoding

Base64 는 바이너리 데이터 - 실행파일, ZIP 파일 등을 문자코드에 영향 받지 않는 공통 ASCII 영역 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식

해당 인코딩은 전자 메일을 이용하는 이미지 등의 바이너리 데이터를 전달하는 용도로 고안되었다. 일반적으로 웹 사이트 내에서 요청 매개변수 값이나 세션 등의 난독화 용도로 사용되기도 하나 이는 Base64 디코딩이 쉽게 이루어 진다 라는 사실을 인지하지 못한 상태에서 사용했기 때문이다. HTTP 인증 시 사용자 자격 증명 데이터를 인코딩할 때 사용되기도 한다.

Base64 는 64개의 알파벳 대소문자숫자, 그리고 "+", "/" 기호로 구성되며 끝 코드 "=" 또는 "==" 를 사용하기도 한다.
→ 해당 인코딩 이용 시 원본의 33% 크기가 증가한다.

Base64 프로세스

  1. 각 블자를 8Bit 블럭으로 나눈다.
  2. 8Bit 단위 블럭 3개를 결합, 24Bit 그룹으로 만든다.
  3. 24Bit 그룹은 다시 6Bit 단위 개별그룹으로 나눈다.
  4. 각 6Bit 단위 개별 그룹을 색인표에 따라 변환한다.
  5. 24Bit 그룹 구성 시 8Bit 단위로 채워지지 않고 누락되는 경우 글자 수 만큼 =로 채운다.

문자열 "RedSec Kai_HT" 를 인코딩하는 경우 아래와 같이 변환된다.

UmVkU2VjIEthaV9IVA==

http://kevinlitchfield.com/base64-visualizer/?string=RedSec%20Kai_HT

각 글자가 8Bit 블럭 3개 묶음으로 24Bit 그룹으로 총 5개의 그룹으로 나뉜 것을 확인할 수 있으며, 각 글자를 6Bit 씩 나눠 Base64 색인표에 대응하는 문자로 변환했다. 마지막 그룹에선 24Bit 를 채우지 못한 영역을 0으로 채워 =로 치환시켰다.

Unicode Encoding

유니코드는 지구 상에 존재하는 모든 문자를 컴퓨터 내 일괄 표현 및 처리하기 위한 국제 표준이다.
해당 표준을 관리하는 단체로 유니코드 컨소시엄 이라는 곳이 존재하며 해당 단체에선 각 글자마다 고유 코드를 매핑시켰다. 해당 고유 코드를 Code Point 라고 정의하고 있으며 코드 포인터에 보통 U+ 라는 접두사가 붙는다.

문자열 RedSec Kai_HT

R e d S e c   K a i _ H T
U+0052 U+0065 U+0064 U+0053 U+0065 U+0063 U+0020 U+004B U+0061 U+0069 U+005F U+0048 U+0054

 을 유니코드로 표현하면 다음과 같다.

유니코드는 단순 매핑 방식으로 이루어지며 어떤 문자에 대해 이진 수로 표현된 숫자를 8Bit 길이에 저장하느냐, 16Bit 길이에 저장하느냐 빅 엔디언 / 리틀 엔디언 방식으로 저장하느냐 등 유니코드 숫자를 저장하거나 표현하는 방식을 의미한다.
유니코드 인코딩 방식은 다양한 기법이 존재하며 코드 포인트 길이의 고정 및 가변 여부에 따라 나눌 수 있다.

길이 고정 방식

  • UCS-2 : 2 Byte (16 Bit) 내 1개 문자 저장
  • UCS-4 : 5 Byte (32 Bit) 내 1개 문자 저장

위와 같은 코드포인트 길이가 고정인 경우 1 Byte 면 충분한 알파벳에 비효율적이라 해당 문제 개선을 위해 코드포인트를 가변 길이로 하는 인코딩 방식이 고안되었다. 대표적으로 UTF-8, UTF-16 이 대표적.

UTF-16

기본 다국어 평면 - U+0000 ~ U+FFFF 까지 속하는 문자 저장을 위해 2Bye (16Bit) 를 사용한다.
고정 길이 인코딩 UCS-2 와 유사하나 이를 확장한 가변 길이 인코딩이다. 대부분의 문자들이 2Byte 길이로 표기가 가능하여 고정 길이 인코딩 방식으로 오해하는 경향이 있지만 다국어 평면 영역 내 속하지 않는 경우 4Byte 를 사용한다.

UTF-16은 단순하게 작동되는데, 원본 문자에 매핑되는 유니코드 값에 접두사 를 사용하여 표기한다.
소문자 h 는 u0068 로 표현할 수 있으며, 한글문자 케 ucf00 으로 표현된다. HTTP 를 통해 전달될 시 문자 하나에 가 추가되어 표기된다.

UTF-8

1110xxxx10xxxxxx10xxxxxx

원본 문자 유니코드 값 길이에 따라 가변적으로 1byte 에서 최대 6byte 로 저장된다. 
특정 코드에 따라 각각 가용공간이 주어지며, 각 공간 내 1과 0이 미리 채워져 있고 가용공간 x 가 존재한다 가정된다. 이때 미리 채워진 0과 1은 데이터 정의를 위한 선언 값으로 의미는 다음과 같다. 

가용공간이 7Bit 로 공간이 1Byte 인 경우

  • 최초 Bit 가 0 일 경우, 해당 데이터는 1Byte 이하

가용공간이 11Bit (혹은 그 이상) 으로 공간이 2Byte 인 경우

  • 최초 Bit 가 1 일 경우 1 Byte 초과
  • 최초 Bit 이후 후속 바이트가 1인 경우 후속 Byte  존재
  • 세 번째 Byte 값이 0인 경우 선언 종료, 가용공간 x 이후 나오는 값이 1인 경우 후속 바이트.

해당 선언대로 작성된 데이터는 크게 3Byte 공간, 가용공간 16Bit 으로 볼 수 있다.

  1. 1Byte 영역 : 해당 데이터는 1Byte 초과, 후속바이트 2개 존재.
  2. 2Byte 영역 : 후속 바이트 1개
  3. 3Byte 영역 : 후속 바이트 1개

그렇다면 이후 4 ~ 6 Byte 형식의 경우 어떻게 정의될까.
b라는 알파벳 소문자 유니코드 값은 0x0062 로 해당 값을 이진 수로 나타내면 0000 0000 0110 0010 이다. 해당 값에서 마지막 데이터 110 0010 는 7Bit 에 저장할 수 있으므로 가용공간 1Byte 용량에 담는 것이 가장 효율적이며 다음과 같이 변환할 수 있다. → 0110 0010 값으로 전환되고 0x62 로 변환된다.

Hex Binary Encoding

추가로 바이너리가 더 큰 경우 ex) Я, '버' 도 다음과 같이 동일하게 적용된다.

버 라는 한글 문자는 유니코드 값으로 0xBC84 인데, 이진 수로 변환 시 1011 1100 1000 0100 이다. 해당 값은 16 Bit 으로 가용공간이 16 Bit 인 3 Byte 용량의 공간이 필요하며, 각각의 비트를 가용공간 순서대로 채워 넣을 시 1110 1011 1011 0010 1000 0100 이 되며 해당 값은 다시 16진수로 변환, 0xEB 0xB2 0x84 가 된다. 이 값을 이용하여 HTTP 통신으로 전송하게 되면 URL 인코딩 값은 %EB%B2%84 가 된다. URL 내 포함된 한글 문자가 해당 형식으로 보이는 것은 UTF-8 로 변환되었기 때문이다.

Hex Encoding

Hex 인코딩은 16 진수를 의미하며, 문자열을 각각 바이트에 해당하는 두 자리 16진수 문자로 변환하는 인코딩 기법이다.
바이너리 데이터를 일반 텍스트로 변환하는 간단한 방법이며, 문자열 내 각각의 문자는 16진수 문자로 변환되게 된다.
eg. K=4Ba=61i=69_=5FH=48T=54

Kai_HT ━━━━━━━━━━━━━━━━━━━→ 4b61695f4854

'Training > BugBountyClub' 카테고리의 다른 글

Cookie & Session  (0) 2023.08.31
Web & HTTP  (0) 2023.08.30