挨拶
こんにちは、昨今名古屋港での障害が発生したり、セキュリティ対策が叫ばれるようになっていますね。
私も学生でありながら頻繁にセキュリティーにまつわるニュースやお話をお伺いすることが多いです。
今回解説する範囲
今回は問題の解き方を解説するのではなく、いくつかの問題を解く際に使用するテクニックについてOWASP juice shopのソースコード付きで解説いたします。
解説本文
OWASP juice shopではアナウンスのテキスト文書などを/ftpに配置して企業情報などのページからハイパーリンクでファイルへ直接アクセスできるようにされています。
※/ftpの内容
※/#/aboutで実際に使われている/ftp/legal.mdに対するハイパーリンク
※/ftp/legal.mdの内容
しかし、この/ftpというエンドポイントでは機微情報を含むファイルまで同ディレクトリで管理されており、情報の保護が不十分といえるのではないでしょうか。一応のアクセス制御としてダウンロード可能なものを.mdか.pdfのみに絞るというアクセス制御がなされておりますが、このアクセス制御はバイナリセーフではないため、悪用が可能です。攻撃コードを紹介する前に、アクセス制御の仕組みを解説しておきます。このアクセス制御では、ユーザからのリクエストがあると、そのリクエストされたファイル名の拡張子がPDFかMDであるかどうか検査します。ちょうどこのコードが/ routes/ fileServer.tsにあり、要約すると以下のようなコードのような単純な比較によって行われておりました。
//ファイル名の検査
if (utils.endsWith(fileName, ".md") || utils.endsWith(fileName, ".pdf")) {
//ファイル名からヌルバイト以降を削除
fileName = security.cutOffPoisonNullByte(fileName);
//ファイル内容をクライアントへ送信
return res.sendFile(path.resolve("ftp/", fileName));
}
このコードの問題点はずばり処理の順番だと思います。ではここで、以下のような攻撃コードが渡された場合を考えてみましょう。
/ftp/secret.txt%2500.pdf
ひとまず%2500は%25がパーセントを表すため%00になり、ヌルバイトを表します。
ちなみに%2500をそのままヌルバイトを表す%00にしてリクエストしてみるとBad Requestになりました。(単なるヌル文字はブロックするようになっているのだと思います)
そして終端に.pdfとついているため、アクセス制御には適合いたします。次にヌルバイト以降を削除するため、/ftp/secret.txtになります。これにより、secret.txtに対するアクセスが成立してしまいます。