このページの本文へ

初心者歓迎!ネットワークセキュリティ入門 第3回

ネットワークの脅威と対策を一から学ぼう

拡がるWebの脅威と対策を理解しよう

2009年08月27日 06時00分更新

文● 水岡祥二

  • この記事をはてなブックマークに追加
  • 本文印刷

バッファオーバーフローとディレクトリトラバーサル

 前パートまでは、おもにエンドユーザーに対する攻撃を紹介してきた。後半は、こうしたエンドユーザーに対する攻撃の原因ともなるWebサーバやアプリケーションに対する攻撃を見ていこう。

 まず「バッファオーバーフロー攻撃」は、攻撃者が脆弱性のあるWebページのフォームに長大な文字列などのデータを送信し、意図的にプログラムの動作を停止させたり、管理者権限を奪う攻撃方法である。「バッファオーバーラン」ともいう。

 あらかじめプログラムで確保しているメモリ領域(バッファ)のサイズを超えてデータが入力されると、その領域だけではデータが格納できなくなりあふれ出てしまう。これがバッファオーバーフローである。バッファオーバーフローが発生すると、そのプログラムのアクセス権限でWebサーバを操作することができてしまう。

 たいていの場合、Webサーバのプログラムは管理者権限で動作している。そのため、管理者権限を攻撃者に奪われてしまう可能性がある。

 一方、「ディレクトリトラバーサル」は、相対パス記法を利用して、管理者やユーザーの想定しているのとは別のディレクトリのファイルを指定するソフトウェアの攻撃方法である。こちらは「パストラバーサル」ともいう。

 通常、パスを移動させるためには「絶対パス記法」と「相対パス記法」※5とがある。しかし、攻撃者が脆弱性の残ったWebページの入力フィールドに相対パス記法の上位ディレクトリを表わす「../」を含んだデータを入力すると、意図しないファイルを読み出したり、書き込んだりすることが可能になってしまう(図5)。

図5 外部からサーバのディレクトリを不正に閲覧するディレクトリトラバーサル

※5:絶対パス記法と相対パス記法 絶対パス記法の場合、カレントドライブからの指定となるので「/root/b/v」。相対パス記法ではカレントパスからになるので、上位ディレクトリを表わす「..//」を用いて、「../../b/v」とする。

 こうしたWebサーバやOSの防御としては、ベンダーが提供しているセキュリティパッチを確実に当てることが挙げられる。加えてバッファオーバーフロー対策としてはプログラム内のメモリ領域管理を見直す。ディレクトリトラバーサル対策としては、入力値に上位ディレクトリを表わす「../」やパス名が含まれているかどうかチェックし、アクセス制限をかける。

データベースを狙うSQLインジェクション

 ここまで紹介してきたのは、おもにWebサーバの設定ミスやOSの脆弱性を突く攻撃であった。しかし、昨今はWebアプリケーションやその背後で動作するデータベースの脆弱性を狙った攻撃が増えている。

 SQLインジェクションは、攻撃者がWebページのフォームの入力フィールドにSQLで特別な意味を持つ記号や単語を埋め込み、開発者が意図していない命令をデータベースサーバに実行させる攻撃方法である(図6)。インジェクションとは「注入」を意味し、SQLに不正なSQLを注入することを表わしている。これによりデータベースの情報を参照され、機密情報や個人情報が漏えいしてしまう。また、データベース情報の消去・改ざんにより、データの完全性が失われたり、データベースが停止し、最悪サービスが提供できなくなる危険性もある。

図6 データベースを悪用するSQLインジェクション

 SQLインジェクションの手法として、攻撃者がWebページのフォームの入力フィールドに故意にデータベースサーバにエラーを発生させるように入力を行ない、そのエラーメッセージの内容から機密情報を盗み出す手口もある。攻撃者がデータベースサーバにエラーを発生させるため、HTTPリクエストとともにSQLクエリをWebサーバに送信する。この結果、出力されたエラーメッセージから、たとえば「user1@test.jp」などのメールアドレスが取得できるわけだ。さらに大量のHTTPリクエストを送信するツールを使用すれば、データを短期間に大量に不正取得することが可能になる。

 同様の手口として、Webサーバに対して不正なOSコマンドを発行させる「OSコマンドインジェクション」という手法もある。

(次ページ、「クロスサイトスクリプティング」に続く)


 

カテゴリートップへ

この連載の記事