hacktricks/pentesting-web/email-injections.md
2024-02-10 21:30:13 +00:00

12 KiB

이메일 주입


Trickest를 사용하여 세계에서 가장 고급 커뮤니티 도구로 구동되는 워크플로우를 쉽게 구축하고 자동화하세요.
오늘 바로 액세스하세요:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!

HackTricks를 지원하는 다른 방법:

보낸 이메일에 주입하기

발신자 인수 뒤에 Cc 및 Bcc 주입하기

From:sender@domain.com%0ACc:recipient@domain.co,%0ABcc:recipient1@domain.com

인자 주입

The message will be sent to the recipient and recipient1 accounts.

인자 주입하기

From:sender@domain.com%0ATo:attacker@domain.com

메시지는 원래 수신자와 공격자 계정에 전송됩니다.

주제 인자 주입

From:sender@domain.com%0ASubject:This is%20Fake%20Subject

가짜 제목은 원래 제목에 추가되거나 경우에 따라 대체됩니다. 이는 메일 서비스의 동작에 따라 다릅니다.

메시지 본문 변경하기

두 줄의 개행을 삽입한 다음, 메시지 본문을 변경하기 위해 메시지를 작성하세요.

From:sender@domain.com%0A%0AMy%20New%20%0Fake%20Message.

PHP mail() 함수 악용

The mail() function in PHP is commonly used to send emails from a web application. However, if not properly secured, it can be vulnerable to email injection attacks. Email injection occurs when an attacker is able to manipulate the email headers and inject malicious content into the email.

PHP mail() 함수는 웹 애플리케이션에서 이메일을 보내는 데 자주 사용됩니다. 그러나 적절하게 보호되지 않으면 이메일 주입 공격에 취약할 수 있습니다. 이메일 주입은 공격자가 이메일 헤더를 조작하고 악성 콘텐츠를 이메일에 주입할 수 있는 경우 발생합니다.

To exploit this vulnerability, an attacker can craft a specially formatted email that includes additional headers. These headers can be used to execute arbitrary code or perform other malicious actions. The most common technique used in email injection attacks is to inject a newline character followed by the attacker's own headers.

이 취약점을 악용하기 위해 공격자는 추가 헤더를 포함한 특수한 형식의 이메일을 작성할 수 있습니다. 이러한 헤더는 임의의 코드를 실행하거나 다른 악성 동작을 수행하는 데 사용될 수 있습니다. 이메일 주입 공격에서 가장 일반적으로 사용되는 기술은 개행 문자를 주입한 다음 공격자의 헤더를 추가하는 것입니다.

Here is an example of a vulnerable PHP code snippet that uses the mail() function without proper input validation:

다음은 적절한 입력 유효성 검사 없이 mail() 함수를 사용하는 취약한 PHP 코드 스니펫의 예입니다:

<?php
$to = $_POST['to'];
$subject = $_POST['subject'];
$message = $_POST['message'];

$headers = "From: " . $_POST['from'] . "\r\n";
$headers .= "Reply-To: " . $_POST['reply-to'] . "\r\n";

mail($to, $subject, $message, $headers);
?>

To prevent email injection attacks, it is important to properly validate and sanitize user input before using it in the mail() function. This can be done by using functions like filter_var() or htmlspecialchars() to ensure that the input does not contain any malicious characters or headers.

이메일 주입 공격을 방지하기 위해서는 mail() 함수에서 사용하기 전에 사용자 입력을 적절하게 유효성 검사하고 정리하는 것이 중요합니다. 이를 위해 filter_var() 또는 htmlspecialchars()와 같은 함수를 사용하여 입력이 악성 문자나 헤더를 포함하지 않도록 해야 합니다.

Here is an example of a secure version of the previous code snippet that properly validates and sanitizes user input:

다음은 사용자 입력을 적절하게 유효성 검사하고 정리하는 이전 코드 스니펫의 안전한 버전의 예입니다:

<?php
$to = filter_var($_POST['to'], FILTER_VALIDATE_EMAIL);
$subject = htmlspecialchars($_POST['subject']);
$message = htmlspecialchars($_POST['message']);

$headers = "From: " . htmlspecialchars($_POST['from']) . "\r\n";
$headers .= "Reply-To: " . htmlspecialchars($_POST['reply-to']) . "\r\n";

if ($to && $subject && $message) {
    mail($to, $subject, $message, $headers);
}
?>

By properly validating and sanitizing user input, you can prevent email injection attacks and ensure the security of your web application.

사용자 입력을 적절하게 유효성 검사하고 정리함으로써 이메일 주입 공격을 방지하고 웹 애플리케이션의 보안을 보장할 수 있습니다.

# The function has the following definition:

php --rf mail

Function [ <internal:standard> function mail ] {
- Parameters [5] {
Parameter #0 [ <required> $to ]
Parameter #1 [ <required> $subject ]
Parameter #2 [ <required> $message ]
Parameter #3 [ <optional> $additional_headers ]
Parameter #4 [ <optional> $additional_parameters ]
}
}

5번째 매개변수 ($additional_parameters)

이 섹션은 공격자가 이 매개변수를 제어한다고 가정하여 이를 악용하는 방법에 대해 기반으로 합니다.

이 매개변수는 PHP가 이진 sendmail을 호출하는 데 사용할 명령줄에 추가됩니다. 그러나 이는 함수 escapeshellcmd($additional_parameters)를 사용하여 살균됩니다.

공격자는 이 경우에 sendmail에 대한 추가 매개변수를 주입할 수 있습니다.

/usr/sbin/sendmail의 구현 차이점

sendmail 인터페이스는 시스템에 설치된 MTA 이메일 소프트웨어(Sendmail, Postfix, Exim 등)에 의해 제공됩니다. 기본 기능(-t -i -f 매개변수와 같은)은 호환성을 위해 동일합니다. 그러나 설치된 MTA에 따라 기타 기능과 매개변수가 크게 다릅니다.

다음은 sendmail 명령/인터페이스의 다른 매뉴얼 예입니다:

sendmail의 원본에 따라 다른 옵션을 악용하는 데 사용할 수 있는 것들이 발견되었습니다. 이를 통해 파일을 유출하거나 임의의 명령을 실행할 수 있습니다. https://exploitbox.io/paper/Pwning-PHP-Mail-Function-For-Fun-And-RCE.html에서 확인하세요.

이메일 이름에 주입하기

이메일에서 무시되는 부분

+, -{} 기호는 흔치 않은 경우에는 대부분의 이메일 서버에서 태그 지정 및 무시되는 데 사용될 수 있습니다.

괄호 () 사이의 주석은 무시됩니다.

화이트리스트 우회

https://www.youtube.com/watch?app=desktop&v=4ZsTKvfP1g0

따옴표

https://www.youtube.com/watch?app=desktop&v=4ZsTKvfP1g0

IP

IP를 도메인 이름처럼 대괄호로 묶어 사용할 수도 있습니다:

  • john.doe@[127.0.0.1]
  • john.doe@[IPv6:2001:db8::1]

기타 취약점

https://www.youtube.com/watch?app=desktop&v=4ZsTKvfP1g0

제3자 SSO

XSS

github 또는 salesforce와 같은 일부 서비스에서는 XSS 페이로드가 포함된 이메일 주소를 생성할 수 있습니다. 이러한 공급자를 사용하여 다른 서비스에 로그인할 수 있고, 이 서비스가 이메일을 올바르게 살균하지 않는다면 XSS를 유발할 수 있습니다.

계정 탈취

salesforce와 같은 SSO 서비스주어진 이메일 주소를 확인하지 않고 계정을 생성할 수 있고, 그 계정을 신뢰하는 다른 서비스에 로그인할 수 있다면 어떤 계정에도 접근할 수 있습니다.
단, salesforce는 주어진 이메일이 확인되었는지 여부를 나타내지만, 응용 프로그램은 이 정보를 고려해야 합니다.

Reply-To

From: company.com 및 _Replay-To: attacker.com_을 사용하여 이메일을 보낼 수 있으며, 이메일이 내부 주소에서 보내진 경우 자동 응답이 전송되면 공격자는 해당 응답을 받을 수 있을 수 있습니다.

하드 바운스 비율

AWS와 같은 특정 서비스는 일반적으로 10%로 설정된 하드 바운스 비율이라는 임계값을 구현합니다. 이는 이메일 전송 서비스에게 특히 중요한 지표입니다. 이 비율이 초과되면 AWS의 이메일 서비스와 같은 서비스가 중단되거나 차단될 수 있습니다.

하드 바운스는 수신자의 주소가 잘못되었거나 존재하지 않아 발신자에게 반환된 이메일을 의미합니다. 이는 이메일이 존재하지 않는 주소로 전송되거나 실제 도메인이 아닌 도메인으로 전송되거나 수신자 서버가 이메일을 수락하지 않는 경우 등 다양한 이유로 발생할 수 있습니다.

AWS의 경우, 1000개의 이메일을 보내고 그 중 100개가 하드 바운스로 결과가 나온다면(잘못된 주소나 도메인 등의 이유로), 이는 10%의 하드 바운스 비율을 의미합니다. 이 비율에 도달하거나 초과하면 AWS SES(Simple Email Service)가 이메일 발송 기능을 차단하거나 중단시킬 수 있습니다.

지속적인 이메일 서비스와 발신자 평판 유지를 위해 하드 바운스 비율을 낮게 유지하는 것이 중요합니다. 메일링 리스트에 있는 이메일 주소의 품질을 모니터링하고 관리하는 것은 이를 달성하는 데 큰 도움이 될 수 있습니다.

더 자세한 정보는 AWS의 공식 문서인 AWS SES Bounce Handling를 참조하십시오.

참고 자료

htARTE (HackTricks AWS Red Team Expert)를 통해 **제로에서 영웅까지 AWS 해킹을 배워보세요**!

HackTricks를 지원하는 다른 방법: