概要
webarenaでubuntu18.04やってみた。
vpsクラウドが終了するらしい。
vpsクラウドからindigoに引っ越す
php2shellには、Cloudflareが利くんじゃね。
参考にしたページ
AIに聞いた。
Apache HTTP Server(Apache2)環境に限定した、HTTP POST通信によるバッファオーバーフロー/メモリ破壊型Webシェル起動(php2shell)の具体的な攻撃例を解説します。
特にApache2環境で伝統的なmod_php(ApacheモジュールとしてPHPを動かす方式)を採用している場合、アプリケーションコードが1行も実行される前の段階で、認証なしのリモートコード実行(RCE)が成立してしまう、非常に強力な攻撃シナリオが存在します(2026年10月に公開された「PHP2Shell」脆弱性がこれに該当します)。
Apache2における攻撃のメカニズム
Apache2のmod_php構成では、Webサーバーのプロセス(Apacheのワーカー)自体が直接PHPの実行エンジンを内包しています。
攻撃者は、アプリケーションのログイン画面やファイルアップロード機能の有無に関係なく、Apache2が稼働する任意のURLに対して、極端に巨大な、または不自然に破損したマルチパート(Multipart)データを含むPOSTリクエストを送信します。
この時、PHPコアがPOSTデータの解析中にメモリ不足(OOM: Out Of Memory)などの致命的エラーを起こすと、C言語レイヤーで内部状態が未初期化のまま中断されます。
Apacheワーカーはその後にクリーンアップ(メモリ解放)処理を行いますが、ここで未初期化ポインタの参照(Use-After-Free)やヒープの破壊(バッファオーバーフローの一種)が発生し、プログラムの制御(実行権限)が攻撃者のマシン語へと乗っ取られます。
HTTP POST 攻撃リクエストの実例
以下は、Apache2上のPHPのメモリ管理機構(OOM/UAF)を狂わせるために構成される、概念的な攻撃POSTリクエストの構造です。
http
POST /any_existing_file.php HTTP/1.1
Host: target-apache2-server.local
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryAttack
Content-Length: 52428800
------WebKitFormBoundaryAttack
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
x
------WebKitFormBoundaryAttack
Content-Disposition: form-data; name="file"; filename="A"
Content-Type: application/octet-stream
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...[数千?数万個の巨大なマルチパート要素、または不正なシリアライズデータ]...
\x90\x90\x90\x90\xeb\x1f...[OSコマンドを実行するシェルコードバイナリ]...
------WebKitFormBoundaryAttack--
攻撃の3ステップ
-
トリガーの送信:
Content-Length を意図的に大きくし、大量のマルチパートフォームデータを送りつけます。
同時に、PHP内部でセッション処理を走らせるための特殊なパラメータ(PHP_SESSION_UPLOAD_PROGRESS など)を混ぜます。 -
Apache2ワーカーのメモリ汚染:
PHPがリクエストを受信・デコードする段階でメモリの限界値(memory_limit)を迎えるか、内部バッファを溢れさせ、エラーハンドラ(longjmp()関数)を無理やり起動させます。 -
制御権の奪取:
本来ならエラー終了して500エラー等を返すはずですが、Apache2ワーカーのメモリ空間に事前に配置しておいたシェルコード(リバースシェルを起動するバイナリ)の番地へ、プロセスの実行命令ポインタが強制的にジャンプさせられます。
攻撃成立後の挙動(Webシェルの起動)
バッファオーバーフロー・メモリ破壊が成功すると、攻撃者はアプリケーションを介さずに、Apache2の実行権限(通常はLinux環境で www-data や apache ユーザー)で
直接OSのシステムコマンドを実行できるようになります。
ここから攻撃者は、さらに以下のようなコマンドを実行して完全な操作権限(シェル)を手に入れます。
- メモリ内での直接実行: ディスクにファイルを一切書き込まず、メモリ上にバックドア(常駐プログラム)を展開する。
- リバースシェルの確立: 攻撃者のサーバー(例: 192.168.1.50:4444)にリクエストを返し、Linuxのコマンドライン(bash)をそのまま乗っ取る。
Apache2環境での防御とログの特徴
このタイプのアタックは、一般的なWebアプリケーションログ(WordPressやフレームワークのログ)には一切痕跡が残りません
(プログラムが実行される前にApacheの内部で落ちるため)。
- 調査すべきログ
Apache2のログから以下の痕跡を探す必要があります。
- error.log: Apache worker exited with signal や不自然なプロセスの強制終了(セグメンテーションフォールト:Segmentation fault)が多発していないか。
- access.log: ステータスコードが 500(内部エラー)や 499、かつ Content-Length やリクエストボディが異常に長いPOST通信がないか。
- Apache2固有の暫定対策
サーバー(PHP本体)のアップデートが最優先ですが、直ちに行えない場合のApache側での暫定的な緩和策は以下の通りです。
- POSTサイズの厳格な制限: Apacheの LimitRequestBody 設定を使用し、不要な大容量POSTリクエストをPHPに渡す前にWebサーバー層で一律で弾く。
- 設定の無効化: php.ini または Apacheの構成ファイル(httpd.conf / .htaccess)で、攻撃経路となる機能を強制オフにする。ini
php_admin_flag session.upload_progress.enabled off
Cloudflareは、利きますか。
結論から言うと、Cloudflareを経由させる(プロキシ(雲マーク)をONにする)だけで、この手のリモートコード実行(RCE)を狙うバッファオーバーフロー攻撃の多くを、「自動的に遮断(回避)」できます。
ただし、完璧に逃げ切るためには1つだけ絶対に落としてはいけない必須の設定があります。
Cloudflareがなぜ有効なのか、そしてすり抜けを防ぐための必須設定を解説します。
Cloudflareで防げる理由(なぜ逃げれるのか)
Cloudflareを通すと、攻撃者のPOSTリクエストが直接あなたのVPSに届かなくなり、以下の強力な防御壁が機能します。
防御機能 仕組みと効果
-
WAF(Web Application Firewall)
無料プランでも、既知の脆弱性(CVE-XXXX-XXXX)を狙う特有のバイナリパターンや、不正なマルチパート構造を持つPOSTリクエストを
Cloudflareのエッジサーバー側で自動的に検知・ブロックします。 -
HTTPリクエストのサニタイズ
Cloudflareは、届いたHTTP POSTリクエストを一度分解し、綺麗なHTTP規格に再構築してVPSに転送します。
これにより、バッファオーバーフローを狙うような「規格外に壊れたパケット」はVPSに届く前にエラーとして弾かれます。 -
リクエストサイズの制限
Cloudflare(無料プラン)は、デフォルトで100MBを超えるPOSTリクエストを通しません。
ギガバイト級の超巨大データを送りつけてメモリ不足(OOM)やヒープオーバーフローを狙う攻撃は、入り口で強制シャットアウトされます。
ただし、これだけでは「すり抜け」が起きます(必須対策)
Cloudflareを導入しても、「攻撃者があなたのVPSの『生のIPアドレス(Global IP)』を直接叩いてきた場合」、Cloudflareの防御をすべてバイパスして、Apache2に直接攻撃が届いてしまいます。
これを防ぐために、**VPS側のファイアウォール(UFWやiptablesなど)で「Cloudflareからの通信しか受け付けない」という設定を絶対にセットすることです。
以上。