Подарок на новый год! CVE-2016-10033 + CVE-2016-10045
Категория: / DEV Блог
/ PHP (LAMP)
К новому году опубликована уязвимость, позволяющая выполнить произвольный удаленный код на на любых php сайтах с формами обратной связи. Эксплуатируется вызов функции mail в популярных библиотеках PHPMailer, SwiftMailer.
Началось все с исправления уязвимости CVE-2016-10033 в PHPMailer 5.2.17: добавили экранирование переменной $sender функцией escapeshellarg() перед вызовом функции mail(). Однако, не учли что использование функции экранирования escapeshellarg() может конфликтовать с escapeshellcmd(), которая применяется для пятого параметра саймой функцией mail(). В результате мы получим неэкранированную последовательность, которая передается параметром к системному вызову mail, что ведет к возможности выполнения любой шелл команды.
Например:
Эксплуатация возможна, если указать параметр `-X`, который позволяет записать лог работы вызова sendmail в файл (нужны права записи вебсервером).
Т.к. в логе окажутся все поля, в тело сообщения мы можем поместить произвольный php code, который потом можно будет вызвать.
Пример поля `mail` для экспойта
Фикс:
Используйте валидацию! Простая проверка email до вызова метода отправки сообщения не даст выполнить опасный код
Для PHPMailer уже выпущен очередной патч.
Пруф/PoC
PHPMailer < 5.2.20 Remote Code Execution (0day Patch Bypass/exploit)
https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10045-Vuln-Patch-Bypass.html
Сюда же: небезопасные escapeshellcmd и escapeshellarg
Security Advisory: PHP's escapeshellcmd and escapeshellarg are insecure
https://gist.github.com/Zenexer/40d02da5e07f151adeaeeaa11af9ab36
PHPMailer объясняет суть уявимости
https://github.com/PHPMailer/PHPMailer/wiki/About-the-CVE-2016-10033-and-CVE-2016-10045-vulnerabilities
Началось все с исправления уязвимости CVE-2016-10033 в PHPMailer 5.2.17: добавили экранирование переменной $sender функцией escapeshellarg() перед вызовом функции mail(). Однако, не учли что использование функции экранирования escapeshellarg() может конфликтовать с escapeshellcmd(), которая применяется для пятого параметра саймой функцией mail(). В результате мы получим неэкранированную последовательность, которая передается параметром к системному вызову mail, что ведет к возможности выполнения любой шелл команды.
Например:
$mail->SetFrom("\"Attacker\\' -Param2 -Param3\"@test.com", 'Client Name');
#вызовет sendmail с параметрами
0 = [/usr/sbin/sendmail]
1 = [-t]
2 = [-i]
3 = [-f\"Attacker\\\]
4 = [-Param2]
5 = [-Param3"@test.com']
Эксплуатация возможна, если указать параметр `-X`, который позволяет записать лог работы вызова sendmail в файл (нужны права записи вебсервером).
Т.к. в логе окажутся все поля, в тело сообщения мы можем поместить произвольный php code, который потом можно будет вызвать.
Пример поля `mail` для экспойта
$mail = "\"attacker\\' -oQ/tmp/ -X/var/www/site/writable/phpcode.php some\"@email.com";
Фикс:
Используйте валидацию! Простая проверка email до вызова метода отправки сообщения не даст выполнить опасный код
if (!filter_var($params['email'], FILTER_VALIDATE_EMAIL)) die('Watchout!');
Для PHPMailer уже выпущен очередной патч.
Пруф/PoC
PHPMailer < 5.2.20 Remote Code Execution (0day Patch Bypass/exploit)
https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10045-Vuln-Patch-Bypass.html
Сюда же: небезопасные escapeshellcmd и escapeshellarg
Security Advisory: PHP's escapeshellcmd and escapeshellarg are insecure
https://gist.github.com/Zenexer/40d02da5e07f151adeaeeaa11af9ab36
PHPMailer объясняет суть уявимости
https://github.com/PHPMailer/PHPMailer/wiki/About-the-CVE-2016-10033-and-CVE-2016-10045-vulnerabilities