Base64 인코딩의 개념과 필요성
Base64는 바이너리 데이터를 인쇄 가능한 ASCII 텍스트 문자열로 변환하는 인코딩 스킴입니다. 네트워크 프로토콜이나 웹 환경에서는 바이너리 데이터를 직접 전송할 경우 데이터 손상이나 제어 문자 충돌이 발생할 수 있습니다. 이를 방지하기 위해 이메일 본문, JSON 페이로드, URL 파라미터 등 텍스트만 허용되는 채널에서 바이너리 데이터를 안전하게 전달할 목적으로 널리 사용됩니다.
문자 세트와 인코딩 프로세스
Base64는 이름 그대로 64개의 기본 문자와 1개의 패딩 문자를 사용합니다.
- 대문자: A-Z (인덱스 0~25)
- 소문자: a-z (인덱스 26~51)
- 숫자: 0-9 (인덱스 52~61)
- 특수문자: + (인덱스 62), / (인덱스 63)
- 패딩: = (데이터 길이를 4의 배수로 맞추기 위해 사용)
변환 알고리즘
- 원본 데이터의 바이트를 8비트 바이너리로 변환합니다.
- 3바이트(24비트)를 하나의 청크로 묶고, 이를 6비트씩 4개의 그룹으로 분할합니다.
- 각 6비트 그룹을 10진수로 변환한 후, Base64 인덱스 테이블에서 해당 문자를 매핑합니다.
- 마지막 청크가 3바이트 미만일 경우, 부족한 비트를 0으로 채우고 패딩 문자(
=)를 추가하여 4문자 길이를 맞춥니다.
예시: 문자열 "Hi"의 인코딩 과정
- 'H'(72)와 'i'(105)의 바이너리:
01001000 01101001(16비트) - 6비트씩 분할:
010010(18),000110(6),100100(36),000000(0 - 패딩 비트) - 테이블 매핑: 18->'S', 6->'G', 36->'k', 패딩->'='
- 최종 결과:
SGk=
CTF에서의 식별 및 활용 패턴
캡처 더 플래그(CTF) 대회에서 Base64는 포렌식(Misc)과 웹(Web) 챌린지에서 빈번하게 등장합니다.
주요 출제 유형
- 다중 인코딩: Base64로 인코딩된 결과를 다시 Base64로 인코딩하는 중첩 구조.
- 혼합 인코딩: Hex, URL 인코딩, Rot13 등과 결합하여 분석 난이도 상승.
- 스테가노그래피: 이미지나 오디오 파일의 메타데이터, 혹은 LSB(Least Significant Bit)에 Base64 문자열을 은닉.
패턴 식별
다음과 같은 특징을 통해 Base64 인코딩 여부를 빠르게 판단할 수 있습니다.
- 문자열이
A-Z,a-z,0-9,+,/로만 구성됨. - 문자열의 총 길이가 반드시 4의 배수임.
- 끝부분에
=또는==패딩이 존재함.
실전 문제 해결: 다중 디코딩
다음은 Base64와 Hex 인코딩이 혼합된 페이로드를 분석하는 예시입니다.
주어진 페이로드:
NjY2YzYxNjc3YjY0NjU2MzY2NjQ2NTVmNmQ2NTdk
분석 및 디코딩 스크립트:
import base64
import binascii
def decode_nested_payload(payload):
# 1단계: Base64 디코딩을 통해 Hex 문자열 추출
decoded_bytes = base64.b64decode(payload)
hex_string = decoded_bytes.decode('utf-8')
# 2단계: Hex 문자열을 바이트로 변환 후 ASCII로 디코딩
raw_bytes = binascii.unhexlify(hex_string)
final_text = raw_bytes.decode('utf-8')
return final_text
target_payload = "NjY2YzYxNjc3YjY0NjU2MzY2NjQ2NTVmNmQ2NTdk"
extracted_flag = decode_nested_payload(target_payload)
print(f"복호화된 결과: {extracted_flag}")
# 출력: 복호화된 결과: flag{decode_me}
웹 보안 및 취약점 분석에서의 연관성
Base64는 단순한 데이터 변환을 넘어 다양한 웹 취약점 공격 벡터에서 난독화 및 우회 수단으로 활용됩니다.
- XSS (크로스 사이트 스크립팅):
btoa()함수를 사용하여 악성 스크립트를 Base64로 인코딩한 뒤,eval(atob(payload))형태로 실행하여 WAF의 시그니처 탐지를 우회합니다. - SQL 인젝션: 쿼리 페이로드를 Base64로 전달하고 서버 측에서 디코딩하여 실행하는 로직이 있을 경우, 필터링 규칙을 회피하는 데 사용됩니다.
- 파일 업로드 변조: 웹셸(Webshell) 코드를 Base64로 인코딩하여 이미지 파일의 EXIF 데이터나 주석 영역에 삽입하는 방식으로 업로드 검증을 통과시킵니다.
- 인증 및 세션: HTTP Basic Authentication 헤더나 JWT(JSON Web Token)의 페이로드 부분이 Base64URL 방식으로 인코딩되어 전송됩니다.