Base64

바이너리 데이터를 ASCII 문자열로 인코딩하는 방식입니다.

이를 통해 바이너리 데이터를 텍스트 환경에서도 안전하게 전송하거나 저장할 수 있도록 변환해줍니다.

주로 이메일이나 URL, 인증 토큰 등 다양한 곳에서 사용됩니다.

 

Base64의 특징

1. 3바이트 단위로 끊어서 4개의 문자로 인코딩 합니다.

 

인코딩 전 데이터의 길이가 3의 배수가 아닐경우 마지막에 패딩 문자 =이나 ==가 붙습니다.

이때 3바이트 단위로 끊긴다는 점이 필터링 우회에서 매우 중요합니다.

 

2. 같은 문자열이라도 인코딩 전 데이터가 조금만 바뀌여도 결과가 크게 달라집니다.

 

1번과 이어지는 특징입니다.

 

예를 들어 flag.php를 인코딩하면 ZmxhZy5waHA= 라는 결과값이 나옵니다. 

3바이트 단위로 끊어서 인코딩 하기에 각각 'fla', 'g.p', 'hp'를 인코딩한 값이며 'Zmxh', 'Zy5w', 'aHA='의 값을 가집니다.

3의 배수가 아니기에 끝에 패딩문자가 붙은 모습입니다.

 

하지만 ./flag.php를 인코딩하면 Li9mbGFnLnBocA== 라는 완전 다른 결과가 나옵니다.

역시 3바이트 단위로 끊어 보면 './f', 'lag', '.ph', 'p'로 인코딩 되었고 'Li9m', 'bGFn', 'LnBo', 'cA=='의 값을 가집니다

역시 3의 배수를 맞추기 위해 패딩문자가 두 개 붙어서 인코딩 되었습니다.

 

이때 두 결과 값이 완전히 다른 이유는 각각의 3바이트 단위에 겹치는 문자열이 없이 때문입니다.

반대로 다른 문자열이라도 3바이트 단위로 끊었을 때 겹치는 문자열이 생기면 비슷한 결과값을 나타냅니다.

 

예로 ../flag.php를 인코딩 하면 Li4vZmxhZy5waHA= 라는 값이 나옵니다.

이걸 4개의 문자로 끊어보면 'Li4v', 'Zmxh', 'Zy5w', 'aHA='가 됩니다.

잘 보면 위에서 flag.php를 인코딩 한 값과 동일한 값으로 인코딩 된걸 볼 수있습니다.

../flag.php를 나눠보면 '../', 'fla', 'g.p', 'hp' 로 3바이트 단위가 동일하기에 같은 값이 나온 것 입니다.

 

즉 Base64는 3바이트 단위로 한 개의 블록을 구성하기 때문에 블록에 들어가는 값이 달라지면 완전 다른 값이 나오지만,

반대로 문자열은 달라도 막상 블록에 들어가는 값이 동일하다면 같은 값이 결과에 포함될 수 있습니다.

 

3. Base64 인코딩은 데이터 검증 수단이 아닙니다.

 

위에서 보았듯 같은 값이 들어가면 같은 결과가 나오는 인코딩 방식입니다.

때문에 암호화의 역할을 하지 않으며 무결성 검증 또한 불가능합니다.

말 그대로 데이터를 변환해주는 인코딩 방식이지 보안 기능 처럼 사용하면 안되는 기능입니다.

 

4. Base64는 일정 패턴으로 인코딩됩니다.

 

모든 Base64의 인코딩 값은 A-Z, a-z, 0-9, +, /, 그리고 패딩 문자 = 만으로 이루어집니다.

정규표현식으로 나타내면 다음과 같습니다.

/^[A-Za-z0-9+\/]+={0,2}$/ 

때문에 워게임이나 CTF 문제를 풀 때 값이 위 정규표현식과 일치하다면 Base64로 인코딩된 값인 것을 추측할 수 있습니다.

'보안 > 이론 정리' 카테고리의 다른 글

웹 해킹 - SSTI  (0) 2025.09.15
웹 해킹 - DOM-based XSS  (0) 2025.08.06
curl의 사용법과 보안 활용 정리  (0) 2025.07.09
웹 해킹 - Error Based SQL Injection  (0) 2025.07.08
HTTP 요청의 구조와 헤더의 역할  (0) 2025.07.07

+ Recent posts