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 |