バランスを取りたい

よくCTFの記事を書きます

Apacheのmod_mimeの挙動が危なっかしい

tkbctf#4のITF Point Systemの出題に使ったネタです。
知ったタイミングでブログ記事かなんかにしたかったのですが、問題に使うと決めてしまったので今の今まで書くことが出来ませんでした。


mod_mime - Apache HTTP Server Version 2.4

ファイルは複数拡張子を持つことができ、拡張子の順番は通常は関係ありません。例えば、ファイル welcome.html.fr がコンテントタイプは text/html に、言語はフランス語にマップされる場合、welcome.fr.html もまったく同じ情報にマップされます。 同じメタ情報にマップされる拡張子複数あるときには、言語と コンテントエンコーディングを除いて、 右側にあるものが使用されます。たとえば、.gifMIME タイプ image/gif にマップされ、.html が MIME タイプ text/html にマップされる場合は、ファイル welcome.gif.html は MIME タイプ text/html に関連付けられます。


Apacheのドキュメントにありますが、要は存在する複数拡張子の内、右から順番に見ていってApacheMIMEに存在するものがあればそれを用いるという感じです。

これにより"abc.php.unknown"のような名前のファイルをApachephpとして認識させることが可能になります。tkbctf#4ではこの手法を用いて、ユーザー名をファイル名に含むSQLiteDBファイルにアクセスさせる問題を出題しました。


実際のところ、こんな話があるならいろいろな場所でPHP Remote Code Executionが発生して大事件になっている気がしますが、パッケージマネージャによってはその問題を回避するためか、下記のような設定が書かれています。

#...
<FilesMatch "\.php$">
    SetHandler application/x-httpd-php
</FilesMatch>
#...

この書き方であればファイル名の末尾にphp拡張子があるときだけPHPとして実行させるということができるので安全になります。


ちなみに自分のMac上で動いているApacheでは普通にAddHandlerしていたため、うっかり[username].datみたいな謎ファイルを吐き出すようなWebアプリがあると普通にこの挙動の影響を受けるところでした……