インクルード攻撃@PHP技術

インクルード攻撃です。
インクルード攻撃とは、GETなどの値からファイルを読み込ませるコードがの脆弱性をついた攻撃です。サイト内外から任意のファイルを読み込ませることができ、サイト情報(設定など)の情報が出力されてしまうことがあります。また、読み込みファイルにシェルを実行するスクリプトがあると、最悪rootが奪取される可能性がある危険性の高い脆弱性です。

  • インクルード攻撃 攻撃側

まず、脆弱なコードを作ります。
インクルード攻撃用にGETからファイルパスを取ってその値をそのままincludeで読み込んでいます。

if($_GET['load_file']){
    include $_GET['load_file'];
}

この脆弱性に対して、以下のURLを発行します。

http://localhost/sites/PHPS/2-3.php?load_file=http://yahoo.co.jp

すると・・・Yahooのトップページが表示されました。

  • インクルード攻撃 防御側

これに対しての対策としては

  • allow_url_fopen=Off

です。
allow_url_fopen=Offはphp.iniで設定することができ、URLからのファイル取得を全面的に封じることができます。ただし、php://inputへの対策が別途必要です。

それに加えて、ブラックリストホワイトリスト法を適用する必要があります。
ブラックリスト法ではbasename()関数をかけてからincludeすることで意図としないファイルの読み込みを防ぐことができます。
ホワイトリストでは、読み込んでも良いファイルを事前に配列に格納しておくことで読み込まれるファイル名のチェックができます