Base64 인코딩 메커니즘과 CTF 문제 해결 전략

Base64 인코딩의 개념과 필요성

Base64는 바이너리 데이터를 인쇄 가능한 ASCII 텍스트 문자열로 변환하는 인코딩 스킴입니다. 네트워크 프로토콜이나 웹 환경에서는 바이너리 데이터를 직접 전송할 경우 데이터 손상이나 제어 문자 충돌이 발생할 수 있습니다. 이를 방지하기 위해 이메일 본문, JSON 페이로드, URL 파라미터 등 텍스트만 허용되는 채널에서 바이너리 데이터를 안전하게 전달할 목적으로 널리 사용됩니다.

문자 세트와 인코딩 프로세스

Base64는 이름 그대로 64개의 기본 문자와 1개의 패딩 문자를 사용합니다.

  • 대문자: A-Z (인덱스 0~25)
  • 소문자: a-z (인덱스 26~51)
  • 숫자: 0-9 (인덱스 52~61)
  • 특수문자: + (인덱스 62), / (인덱스 63)
  • 패딩: = (데이터 길이를 4의 배수로 맞추기 위해 사용)

변환 알고리즘

  1. 원본 데이터의 바이트를 8비트 바이너리로 변환합니다.
  2. 3바이트(24비트)를 하나의 청크로 묶고, 이를 6비트씩 4개의 그룹으로 분할합니다.
  3. 각 6비트 그룹을 10진수로 변환한 후, Base64 인덱스 테이블에서 해당 문자를 매핑합니다.
  4. 마지막 청크가 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 방식으로 인코딩되어 전송됩니다.

태그: Base64 CTF 인코딩 XSS SQL인젝션

5월 28일 05:36에 게시됨