47번 문제를 들어가면 위와 같이 화면이 출력된다.
input태그에 문자가 써져있고 send버튼을 누르면 메일이 보내졌다고 출력이 된다.
다른 문자를 넣어봐도 똑같았다.
개발자 도구를 이용해서 소스코드를 봤을때 form태그의 post방식으로 subject값을 넘겨주고 있으며 별
다른 특징이 없다. 문제를 어떻게 접근해야 갈지 고민을 했고 혹시 mail 통신에 대한 문제이지 않을까
싶어서 구글에 mail 통신을 구글링 해보았다.
구글링 결과 메일 통신은 SMTP 프로토컬을 이용해서 통신을 한다고 한다.
그래서 이 SMTP 프로토컬이 무엇인지 알아보았다.
SMTP (Simple Mail Transfer Protocol)
말 그대로 간단한 메일 전송 프로토컬이며 간단 특징은 다음과 같다.
- tcp 프로토컬을 이용
- smtp서버와 클라이언트 구성
- 텍스트기반
간단 통신과정
간단한 통신과정으로는 smtp서버, smtp클라이언트로 구성된다. 우리가 이메일을 보낼때 a@gmail.com 은 클라이언트 가 되는 것이고 @gmail.com , @naver.com 이런것들이 smtp 서버라고 생각하면 된다. 즉 우리가 gmail을 이용하여 naver로 메일을 보내자고 할때 gmail의 smtp 서버에게 데이터(패킷)을 보내고 해당 서버는 naver smtp 서버로 전송하 여 다른 클라이언트에게 전해지는 것이다.
- smtp클라이언트(우리) -> smtp 서버 -> smtp 서버2 -> smtp 클라이언트
이렇게 SMTP에 대해 간략하게 알아보았다 하지만 이 개념으로 어떻게 문제를 해결할지는 알 수 없었다.
그래서 구글링을 해보았고 smtp 메시지(패킷) 구조의 취약점을 이용하여 접근해야 하는것을 알았다.
smtp 헤더 인젝션 공격을 사용하는 것이다.
smtp를 이용하여 패킷을 보낼때 패킷의 헤더에 문자를 삽입하는 것이다.
메일 메시지(패킷)의 구조에 대해 알아보자
메일 메시지 구조
우리가 이메일을 보낼때 전달하고자 하는 곳으로 정확이 찾아가는 이유에는 패킷(데이터)의 구조에 있다.
메시지의 구조는 다음과 같이 정의된다고 한다
헤더 : 이메일 관련 정보
본문 : 이메일 내용
맺음말 : 맺음말
이렇게 3가지로 구성되며 헤더에는 받는 사람이 누군지, 어디서 왔는지, 참조, 숨은참조, 날짜, 제목 등이 있다.
1.받는 사람
To:
2. 보낸 사람
From:
3. 참조
Cc:
4. 숨은참조
Bcc:
5. 제목
Subject:
여기서 참조는 a 라는 사람이 b에게 메일을 보낼때 다른 사람들도 메일을 받을 수 있도록 참조하는것이다.
숨은 참조는 참조와 유사하지만 어느 누구에게 참조를 했는지 헤더에 기록되지 않는다.
이 두가지를 활용해서 injection을 이용한다.
html 화면을 보면 Mail subject: 부분이 보인다. 우에서 언급했던 5.제목이다.
여기서 개행문자를 이용하여 subject: flag\r\nCc:내 메일주소를 입력하면 될 것 같다.
입력을 하고 send를 누르면 별 다른 변화가 없었다.
Mail has benn sent라고 뜨며 메일을 확인하면 아무 변화가 없다.
아무래도 개행문자가 반영이 안되는 것 같다.
따라서 html 태그를 수정해야 될 것 같다.
아까 봤던 코드중에 post방식의 input태그를 testarea로 수정하여 줄바꿈이 되도록 바꾼다.
위와 같이 코드를 수정하고
textarea 부분에 엔터를 이용하여 줄바꿈을 한다. 참조 Cc: 를 입력하여 해당 메일이 나에게도 오도록 값을 입력한다.
값을 입력하면 위와 같이 flag를 얻을 수 있다.
문제 핵심
1. SMTP(간단 메일 전송 프로토컬) 의 개념 및 통신 과정
2. 메일 메시지의 구조와 구성요소
3. SMTP 헤더 injection
'웹 > 웹 해킹 문제' 카테고리의 다른 글
Webhacking.kr 33번 write-up (0) | 2022.12.22 |
---|---|
dvwa 실습 (file upload_low) (0) | 2022.12.08 |
webhacking.kr 20번 write-up (0) | 2022.12.07 |
webhacking.kr 23번 write-up (0) | 2022.12.06 |
webhacking.kr 32번 write-up (0) | 2022.12.04 |