Open1
ウェブ・セキュリティ基礎試験(徳丸基礎試験)⑦
徳丸基礎試験勉強まとめ⑦
「体系的に学ぶ 安全なWebアプリケーションの作り方 第2版」の4章の4.11 ~ 4.14を自分なりにまとめる
アドバイスや間違い指摘など歓迎です
4章 「Webアプリケーションの機能別に見るセキュリティバグ」
4.11 OSコマンド呼び出しの際に発生する脆弱性
OSコマンド呼び出しの際に発生する脆弱性はどんなものがあるの?
- OSコマンドインジェクション
- 内部でOSコマンドを実行する場合(PHPのsystem関数などのシェル呼び出し機能のある関数を利用するなど)へ外部入力を引数として渡している場合などに起こる
- シェルのメタ文字(|, &&, ;など)がエスケープされていない場合、特に危険
OSコマンドインジェクションがあるとどんな影響があるの?
- Webサーバー内のファイル閲覧、改竄、削除
- 重要情報の漏洩
- 別サーバーへの攻撃
- 外部へのメール送信
- マイニング
- Webサーバ停止
OSコマンドインジェクションの対策は?
- OSコマンドの呼び出しを使わない実装方法を選択する
- OSコマンドを呼び出す場合
- 環境変数経由でパラメータを渡す
- パラメータを安全な関数によりエスケープする
- OSコマンドを呼び出す場合
- シェル呼び出し機能のある関数の利用を避ける
- 外部からの入力をコマンドラインのパラメータに渡さない
4.12 ファイルアップロードにまつわる問題
ファイルアップロードにまつわる問題が原因でなにが起こるの?
- アップロード機能に対するDos攻撃
- アップロードされたファイルをサーバー上のスクリプトとして実行する攻撃
- 仕掛けを含むファイルを利用者にダウンロードさせる攻撃
- 閲覧権限のないファイルのダウンロード
アップロード機能に対するDos攻撃があるとどんな影響があるの?
- 応答速度の低下
- サーバー停止
アップロード機能に対するDos攻撃の対策は?
- アップロードファイルの容量制限
- リクエストボディサイズを絞る
- アップロード機能を提供しない場合はアップロードがHTTP経由でできないように設定
アップロードされたファイルをサーバー上のスクリプトとして実行する攻撃があるとどんな影響があるの?
- PHPスクリプトファイルをアップロードされ、アップロードされたファイルにアクセスするとスクリプトが実行されてしまう
- 任意のPHPファイルが実行できるため、OSコマンドインジェクション攻撃と同じ影響がある
アップロード機能に対するDos攻撃の対策は?
- アップロードしたファイルを公開ディレクトリに保存しない
- アップロードするファイルの拡張子を限定する
仕掛けを含むファイルを利用者にダウンロードさせる攻撃があるとどんな影響があるの?
- アップロードされた画像ファイル(htmlやjsが仕込まれている)や、PDFファイル(スクリプトつき)にアクセスするとスクリプトが実行されてしまう
仕掛けを含むファイルを利用者にダウンロードさせる攻撃の対策は?
-
ファイルのContent-typeを正しく設定する(application/pdfなど)
-
レスポンスヘッダX-Content-Type-Options: nosniffを指定
-
ダウンロードを想定したファイルにはレスポンスヘッダContent-Disposition: attachmentを指定
- Content-typeをapplication/octet-streamにする(ダウンロードすべきファイルという意味)
-
PDFを扱う際は、PDFのFormCalcによるコンテンツハイジャックの対策を行う
- PDFファイルはブラウザ内で開かずダウンロードを強制(レスポンスヘッダ: X-Download-Options: noopen)
- PDFをobject要素やembed要素では開けない仕組みを実装する
- X-Download-Options: noopenを指定していても、罠サイトでobject要素やembed要素を用いている場合はFormCalcが実行されてしまうため。
- 簡単な方法としては、ファイルダウンロードをPOSTリクエストに限定する
-
用語: 「PDFのFormCalcによるコンテンツハイジャック」
- PDFはFormCalcと呼ばれるスクリプト言語が使用できる。
- FormCalcにはURL関数という機能があり、HTTPリクエストを呼び出し結果を受け取ることができる
- Adobe Acrobat Readerプラグインを備えたブラウザが影響を受ける(主にIE)
閲覧権限のないファイルのダウンロードがあるとどんな影響があるの?
- URLの推測によって、閲覧されたくないファイルが閲覧されてしまう
4.13 インクルードにまつわる問題
インクルードにまつわる問題が原因でなにが起こるの?
- ファイルインクルード攻撃
ファイルインクルード攻撃に対するDos攻撃の対策は?
- 外部からファイル名を指定する使用を避ける
- セッション保存に使用しているファイルなど、本来見えてはいけないファイルを閲覧できないようにする
- ファイル名を英数字に限定する
- ディレクトリトラバーサル攻撃と同様に別ディレクトリの重要ファイルを閲覧できないようにする
- php.ini でallow_url_include = offにする
- RFI(リモートファイルをインクルード)できなくすることで、RFI攻撃を防ぐ
4.14 構造化データの読み込みにまつわる問題
構造化データの読み込みにまつわる問題が原因でなにが起こるの?
- evalインジェクション
- 安全でないデシリアライゼーション
- XXE(XML外部実体参照)攻撃
evalインジェクションの影響は?
OSコマンドインジェクションと同じ
evalインジェクションの対策は?
- evalを使用しない
- シリアライズ目的なら他の関数を使用(evalではデシリアライズ: 文字列からデータ形式に変換できるが、安全ではない)
- evalの引数に外部パラメータを指定しない
- evalの与える外部パラメータを英数字に制限する
- セミコロンやカンマなど、evalの特殊な記号文字が入らないようにする
安全でないデシリアライゼーションの影響は?
OSコマンドインジェクションと同じ
安全でないデシリアライゼーションの対策は?
- シリアライズ形式ではなくJSON形式でデータを受け渡す
- クッキーやhiddenパラメータではなく、セッション変数など書き換えできない形でシリアライズ形式を受け渡す
- HMACなどの改竄検知を導入してデータが改竄されていないか確認する
XXE攻撃の影響は?
情報漏洩
XXE攻撃の対策は?
- XMLの代わりにJSONを使用する
- libxml2のバージョン2.9以降を使用する
- デフォルトではXML外部実体参照を停止する設定になっている
- ただし、PHP側の設定ではXML外部実体参照できるので注意
- libxml_disable_entity_loaderをtrueに指定し、外部実体参照を禁止する
- これにより、libxml2のバージョンやPHP側の設定にかかわらず、外部実体参照を禁止できる