サイバーセキュリティ演習 ― Webセキュリティ基礎&実践― 8.システムの不正操作対策とHTTPレスポンスの改 竄対策
講義内容 1. 2*. Webサイトの仕組みとWebプログラミング基礎 3.4.5*. 不正スクリプトの実行対策 6.7*. データベースの不正操作対策 8*. システムの不正操作対策とHTTPレスポンスの改竄対策 9*. 偽リクエストによるサービスの不正利用対策 10*. セッションIDの 不正取得対策 11. 総合演習(1) 12*. 公開ディレクトリの不正横断対策と認証認可制御の欠落 による不正アクセス対策とエラーメッセージからの情報 漏えい対策 13. 総合演習(2) 14. 総合演習(3) 15. 学期末試験 ※*はレポートがある回になります。
本日の内容 OSコマンドインジェクション/HTTPヘッダ インジェクションの脆弱性攻撃体験と脆弱 性の修正 システム情報の漏えい Cookie値の変更
OSコマンドとは OSに命令を発行してシステムを操作するコマンド アプリケーション/ソフトウェア シェル(殻)という名称は、OSの機能を実装している中心核部分(カーネル)の外層として動作することからきている OS シェル カーネル システムコール プロセス管理 メモリ管理 デバイス管理 デバイスドライバ Hardware CPU/メモリ HDD NIC
OSコマンドの例 ファイルやディレクトリの一覧を表示 ファイル名の変更 Windows: dirコマンド Linux: lsコマンド dir /b Linux: lsコマンド ls -l ファイル名の変更 Windows: renameコマンド rename [対象のファイル名] [変更後のファイル名] Linux: mvコマンド mv [対象のファイル名] [変更後のファイル名] /b オプション:ファイル名だけ表示
演習テーマ OSコマンドインジェクション 「システムの情報漏えい」のリンクをクリックしま しょう。
OSコマンドインジェクションの原理 ユーザからの入力値をそのままシェルに渡すことにより、意 図しないOSコマンドを実行され、システムを不正に操作さ れてしまう
一般的なOSコマンドの組み立て 対象のファイル名とユーザからの入力値(example.txt)を 利用して文字列連結によりrenameコマンドを組み立てる
入力値に「example.txt & dir」という文字列を与えると シェルによって複数のOSコマンドが実行されます。 その結果、ファイルの一覧が表示されます。
OSコマンドインジェクションの攻撃手口 一度に複数の機能を実行できるシェル機能を使って、 本来のOSコマンドに不正のOSコマンドを追加し、 ファイル名の変更などシステムを不正に操作する 本来のOSコマンド rename test.tx exampe.txt 不正なOSコマンド & dir /b c:\ c:\ドライブのファイル名 とフォルダ名の一覧が表示 される。
参考:シェルの特殊文字の例 コマンド1 & コマンド2 コマンド1 | コマンド2 コマンド < ファイル コマンド1を実行後にコマンド2を実行する コマンド1 | コマンド2 コマンド1の出力をコマンド2の入力として実行する。 コマンド < ファイル コマンドの入力をファイルから読み取る。 コマンド > ファイル コマンドの出力をファイルへ書き出す。
演習内容(疑似的な攻撃) ネットショッピングに対して、不正なOSコマンドを入 力し、Cドライブ直下のファイル名とフォルダ名の一覧 を取得する 脆弱性があるウェブサイト ネットショッピング
演習の進め方 Webサイトの挙動を把握する 脆弱性となる箇所を特定する 不正なOSコマンドを考える 不正に情報を取得する
1.Webサイトの挙動を把握する ネットショッピングにロ グインID「suzuki」、パ スワード 「Administr@tor」でロ グインして、商品管理 ページでファイル名を変 更できることを確認。 攻撃者として、利用でき ることを考える。 ファイル名変更後のURL も確認しましょう。
2.脆弱性となる箇所を特定する 変更後のファイル名にexample.txt &を入力してみる 正常(エラー)
3.不正なOSコマンドを考える ファイル名変更処理では、次のOSコマンドが使用 されています。 rename test.txt [変更後のファイル名] DOSコマンドのアンパサンド(&) を使用してCド ライブ直下のファイル名とフォルダ名の一覧を取得 するOSコマンドを考えましょう。 exampe.txt & dir /b c:\
4.不正に情報を取得する 考えたOSコマンドを使って不正に情報が取得でき るか確認しましょう。 まずは、suzukiのIDでログインしましょう。 ログインIDは「suzuki」 パスワードは「Administr@tor」 ログイン後、商品管理にある変更後のファイル名の 入力欄に考えたOSコマンドを入力しましょう。 exampe.txt & dir /b c:\
4.不正に情報を取得する 「Congratulations!!演習の目標を達成しまし た。」と表示されたら、OKです。
OSコマンドインジェクションの一般的な影響 サーバ内のファイルが不正に操作される ファイルの閲覧による個人情報、機密情報などの漏えいなどの 被害が発生する可能性がある 不正にシステムを操作される 意図しないOSのシャットダウンやユーザの追加、変更が行われ たりする可能性がある。 不正なプログラムがダウンロード、実行される ウィルスやボットの感染、システムへ次回も不正に侵入が行え るようバックドアが設置させられたりしてしまう可能性がある。 他システムへの攻撃の踏み台にされる システムが乗っ取られることで他システムへの攻撃の踏み台に され、他システムのサービスを不能にしてしまうなど加害者と なってしまう可能性がある。
対処方法 原因 外部から入力できるパラメータをそのまま文字列連結 してOSコマンドを実行しているため、一度に複数のOS コマンドを実行するシェル機能を応用することにより 本来のOSコマンドが変更されてしまい、そのまま処理 が実行される 対処方法 外部からのパラメータ入力による外部コマンドの実行 方法を避けて、代替が可能なPHPの関数で実装する。 escapeshellarg関数を用いて外部からのパラメータをエ スケープ処理する方法もやり方の一つ。
PHPの外部コマンド実行関数 system()関数 外部プログラムを実行し、出力を表示する system(OSコマンド) その他にもexec()関数やshell_exec()関数などもある system(OSコマンド) renameコマンドの場合、 <?php $filename = [変更後のファイル名]; rename("test.txt", $filename); ?>
代替え可能なPHP関数の例 OSコマンド PHP関数 ファイルの削除 ファイルの削除 ファイルのコピー ファイルのコピー ファイル名の変更 Windows: delコマンド、 Linux: rmコマンド ファイルのコピー Windows: copyコマンド、 Linux: cpコマンド ファイル名の変更 Windows: renameコマン ド、Linux: mvコマンド PHP関数 ファイルの削除 unlink()関数 ファイルのコピー copy()関数 ファイル名の変更 rename()関数
演習内容(脆弱性の修正) ネットショッピングのOSコマンドインジェクションの 脆弱性となるコードを特定し、シェルを使用しないプロ グラムに修正を行う
修正プログラム ネットショッピング netshopping.php netshopping117.class.php メッセージ割り当て テンプレート表示 netshopping117.class.php ネットショッピングのデータの初期設定 演習課題の攻撃成功判定 管理用メニューの商品一覧の設定 ファイル名変更画面処理
脆弱性の修正の手順 netshopping117.class.php ファイル名変更画面処理の内容の確認。 system関数を使用する箇所の特定。 rename関数を使用するプログラムの修正。
セッション管理に用いられるトークン(認証用乱数)の検証 1.ファイル名変更画面処理の内容の確認 public function proc_rename_file() { if (!$this->check_token()) { $this->proc_logout(); return; } if ($this->is_non_admin()) { $this->set_page(parent::PAGE_GOODS); $this->proc_goods_list(); $param = $this->get_param(); $oldname = (string)$param[parent::OLDNAME]; $newname = (string)$param[parent::NEWNAME]; (次ページに続く) セッション管理に用いられるトークン(認証用乱数)の検証 商品ページのセット ファイル名変更要求時のパラメータ取得
1.ファイル名変更画面処理の内容の確認 変更前後のファイル名の入力が無い場合の警告処理 (つづき) if (!isset($oldname) || ($oldname == "")) { $this->set_content(parent::WARNING9, true); } else if (!isset($newname) || ($newname == "")) { $this->set_content(parent::WARNING10, true); } else if ($oldname == $newname) { $this->set_content(parent::WARNING11, true); } else { $oldname = parent::GOODS_FILE_PATH. basename($oldname); (次ページに続く) 変更前後のファイル名が同じ場合の警告処理 変更前のファイル名を指定
変更前のファイルが存在しない場合の警告処理 1.ファイル名変更画面処理の内容の確認 (つづき) if (is_file($oldname)) { $result = system("rename " . $oldname . " " . $newname); if ($this->is_rename()) { $this->set_content(parent::WARNING12, true); } else { $this->set_content(parent::WARNING13, true); } $this->is_success($result); $this->set_content(parent::WARNING8, true); (次ページに続く) ファイル名を変更するコマンド実行 ファイル名変更の成否時の処理 演習課題攻撃成功判定 変更前のファイルが存在しない場合の警告処理
1.ファイル名変更画面処理の内容の確認 (つづき) $this->set_page(parent::PAGE_ADMIN_GOODS); $this->proc_admin_goods(); } 商品管理画面の表示
2. system関数を使用する箇所の特定 $oldname = parent::GOODS_FILE_PATH. basename($oldname); if (is_file($oldname)) { $result = system("rename " . $oldname . " " . $newname); if ($this->is_rename()) { $this->set_content(parent::WARNING12, true); } else { $this->set_content(parent::WARNING13, true); } $this->is_success($result); (省略)
3. rename関数を使用するプログラムの修正 $oldname = parent::GOODS_FILE_PATH. basename($oldname); if (is_file($oldname)) { $newname = parent::GOODS_FILE_PATH.$newname; $result = rename($oldname, $newname); if ($this->is_rename()) { $this->set_content(parent::WARNING12, true); } else { $this->set_content(parent::WARNING13, true); } $this->is_success($result); (省略)
動作確認 ログインIDに「suzuki」、パスワードに 「Administr@tor」を入力してログインしてみましょう。 商品管理ページの変更後ファイル名入力欄に以下のOS コマンドを入力してみましょう。 exampe.txt & dir /b c:\ ファイル名が変更されなければOKです。
OSコマンドインジェクションの要点 OSコマンドインジェクションの脆弱性の原因は、ユー ザから受け取った入力値をそのまま文字連結してOSコ マンドを組み立てていることです。 意図しないOSコマンドの実行を防ぐために、外部から のパラメータ入力による外部コマンドの実行方法を避け て、PHPが提供する代替可能な関数を利用するようにし ましょう。なお、外部からのパラメータを用いたOSコ マンドの実行が必要な場合は、入力パラメータをエス ケープ処理するようにしましょう。
本日の内容 OSコマンドインジェクション/HTTPヘッダ インジェクションの脆弱性攻撃体験と脆弱 性の修正 システム情報の漏えい Cookie値の変更
Webの基本的な動作 HTTP通信によるクライアントサーバモデル WebブラウザはHTTPリクエストでWebサーバに要求する。 HTTP(HyperText Transfer Protocol)は、HTML文書などのコン テンツの送受信に用いる通信手順 Webサーバソフトウェア データベース Webブラウザ 検索 HTTPリクエスト HTTPレスポンス クライアント Webサーバ
HTTPリクエストの例 GET http://(省略) HTTP/1.1 Host: www.kyushu-u.ac.jp Connection: keep-alive Accept: text/html,application/xhtml+xml,application/xml;q=0 .9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2508.0 Safari/537.36 Referer: http://www.kyushu-u.ac.jp/ Accept-Encoding: gzip, deflate, sdch Accept-Language: ja,en-US;q=0.8,en;q=0.6 Cookie: (省略) リクエストメッセージ リクエストヘッダ
HTTPレスポンスの例 HTTP/1.1 200 OK Date: Thu, 24 Sep 2015 01:05:20 GMT Server: Apache/2 Cache-Control: no-cache Expires: 0 Connection: close Transfer-Encoding: chunked Content-Type: text/html; charset=shift_jis Location: http://survey.html Set-Cookie: ssid=123456789;path=/var/www/html/ <html>(省略)</html> レスポンスメッセージ レスポンスヘッダ レスポンスボディ
HTTPヘッダの構文 ヘッダ名:ヘッダ値 ヘッダ値の部分にHTTPの改行コード(\r\n)が挿入され ると、改行後の文字列は次のヘッダとして解釈される。 連続する改行コードが挿入されると、改行後の文字列は ボディ部として解釈される。 Date: Thu, 24 Sep 2015 01:05:20 GMT Server: Apache/2 (省略) Location: http://survey.html Set-Cookie: ssid=123456789;path=/var/www/html/ <html>(省略)</html> レスポンスヘッダ レスポンスボディ
演習テーマ HTTPヘッダインジェクション 「Cookie値の変更」のリンクをクリックしましょう。
HTTPヘッダインジェクションの原理 ユーザからの入力値をそのまま利用してHTTP通信を実行する ことにより、HTTPヘッダの内容が変更された意図しないHTTP 通信が実行されてしまう
HTTPヘッダインジェクションの攻撃手口 改行コードと不正のHTTPヘッダを注入し、Cookie の値を書き換えることにより、ユーザになりすまし 不正行為を行う
Cookieに保存されたのセッションIDを送信 参考:セッションIDとCookie セッションIDはWebサーバが発行するセッションの識別。 セッション変数はセッションIDと関連パラメータ(ログイ ンIDや日付など)を紐づけした情報を格納する領域 Cookieはブラウザが保持するセッションID。 ログイン情報送信 ID・パスワード認証 セッション変数格納 セッションIDを発行 該当するユーザ専用ページを送付 クライアント Webサーバ セッション変数参照 ログイン済みのアクセス Cookieに保存されたのセッションIDを送信 セッションID検証 該当するページを送付 Webサーバ
演習内容(疑似的な攻撃) ネットショッピングに対して、HTTPヘッダ内容を変更 する不正なURLを入力し、Cookieの値を変更する 脆弱性があるウェブサイト ネットショッピング
演習の進め方 Webサイトの挙動を把握する Cookieを書き換える不正のHTTPヘッダを考える HTTPヘッダ内容を変更するURLを作成し実行する
1.Webサイトの挙動を把握する ネットショッピングのロ グイン後の挙動を確認す る。 攻撃者として、利用でき ることを考える。 ログインID 「yamada」、パス ワード「P@ssword」 ログイン後のHTMLの ソースを確認しましょう。 ログイン失敗時のURLも 確認しましょう。
1.Webサイトの挙動を把握する ログイン後のHTMLソースからCookie値を確認でき ましたか? <form id="form1" name="form3" action="/Web/Scenario121/VulSoft/shop.php" method="get"> <input type="hidden" name="secret" id="secret" value="r1jgsg7r70bt1pptua92c7gr34" /> ログイン失敗時のURLをどのようになっていますか? http://localhost/Web/Scenario121/VulSoft/shop.php?p age=2&login_id=yamada&password=Adminstr%40tor& url=welcome.php&submit=%E3%83%AD%E3%82%B0%E3 %82%A4%E3%83%B3
1.Webサイトの挙動を把握する ログイン失敗時のURLをもとに、 password=P@sswordとしたURLを入力するとどうな りますか? http://localhost/Web/Scenario121/VulSoft/shop.p hp?page=2&login_id=yamada&password=P@ssw ord&url=welcome.php&submit=%E3%83%AD%E3% 82%B0%E3%82%A4%E3%83%B3 ログイン失敗時はGET送信によってパラメータ情報が わかります。 入力フォームにIDとパスワードを入れなくても、この URLをURL欄に入力すればログインできます。
2.Cookieを書き換える不正のHTTPヘッダを考える Set-Cookieの文法 Set-Cookie: [Cookie名=値]; [expires=期限]; [path=Cookieが使用されるURLのパス名]; [domain=Webサーバ名]; secure Cookie名=値の属性は必ず指定する必要がある URLに含めるSet-Cookieを考える Cookie名を「PHPSESSID」、Cookie値を「attackID」、 PATHの値を「/Web/Scenario121」としましょう。 Set-Cookie:+PHPSESSID=attackID;+PATH=/Web/Scenario121 URL上で+は、スペースを意味する。
3.HTTPヘッダ内容を変更するURLを作成し実行する ログイン失敗時のURL参考に、悪用に使えそうな URLは以下の通りです。 http://localhost/Web/Scenario121/VulSoft/shop. php?page=2&login_id=yamada&password=P@ss word&url=welcome.php URLにSet-Cookieヘッダを追記しましょう。 http://localhost/Web/Scenario121/VulSoft/shop. php?page=2&login_id=yamada&password=P@ss word&url=welcome.php%0DSet- Cookie:+PHPSESSID=attackID;+PATH=/Web/Scen ario121
3.HTTPヘッダ内容を変更するURLを作成し実行する URL欄に作成したURLを入力し、ログインできるか 確認しましょう。 ログイン後のソースコードを見てCookieの値が変 更してるか確認しましょう。
3.HTTPヘッダ内容を変更するURLを作成し実行する 「Congratulations!!演習の目標を達成しまし た。」と表示されたら、OKです。
HTTPヘッダインジェクションの一般的な影響 任意のCookieの発行 Set-Cookieヘッダを注入されると、任意のCookieが追加され、 利用者のブラウザに保存される可能性があり、成りすまし攻撃 の被害が起こりえる 表示内容の改ざん 任意のレスポンスボディを注入されると、利用者のブラウザ上 で偽の情報を表示させられたり、任意のスクリプトを埋め込ま れたりする可能性がある。 キャッシュサーバのキャッシュ汚染 任意のレスポンスボディをキャッシュさせることが可能になり、 ウェブページの差し替え(キャッシュ汚染)が発生し、ウェブ ページ改ざんの脅威が生じる。
対処方法 原因 外部から入力できるパラメータをそのまま文字列連結し てHTTPヘッダを作成しているため、改行コードと不正 な処理のコードの注入によりHTTPヘッダが変更されて しまい、そのままHTTPの処理が実行される 対処方法 HTTPレスポンスヘッダに外部からのパラメータを使用 しない実装とする。 HTTPレスポンスヘッダに外部からのパラメータを使用 する必要がある場合、取得したパラメータに対して改行 コードを(正規表現で)チェックする機能を実装する。 改行コードをエスケープ処理する。
演習内容(脆弱性の修正) ネットショッピングのHTTPヘッダインジェクションの 脆弱性となるコードを特定し、外部からの入力値に対す る改行コードのチェック機能の実装を行う
修正プログラム ネットショッピング shop.php shop121.class.php welcome.php メッセージ割り当て テンプレート表示 shop121.class.php ネットショッピングのデータの初期設定 ログイン処理 welcome.php ログイン成功後の遷移画面
脆弱性の修正の手順 shop121.class.php ログイン処理の内容の確認。 改行コードのチェックが必要な箇所の特定。 改行コードチェック機能の実装。
LocationヘッダにそのままURL含めてを送信 1.ログイン処理の内容の確認 public function login() { $param = $this->get_param(); $result = parent::login(); $url = $_GET["url"]; if ($result) { header ("Location: ". $url); exit; } return $result; 遷移先のURLをGETパラメータで取得 LocationヘッダにそのままURL含めてを送信
2.改行コードのチェックが必要な箇所の特定 public function login() { $param = $this->get_param(); $result = parent::login(); $url = $_GET["url"]; if ($result) { header ("Location: ". $url); exit; } return $result;
3.改行コードチェック機能の実装 preg_match関数で 正規表現によるマッチングを行う 正規表現によるマッチングの条件に合わなければ、 public function login() { $param = $this->get_param(); $result = parent::login(); $url = $_GET["url"]; if ($result) { if (preg_match("/[\\r\\n]/", $url) === 0) { header ("Location: ". $url); exit; } else { parent::proc_logout_headerinjection(); } return $result; preg_match関数で 正規表現によるマッチングを行う 正規表現によるマッチングの条件に合わなければ、 インジェクション攻撃を受けた場合のログアウト処理 Scenario_Shop/base_shop.class.phpのproc_logout_headerinjection()を実行
正規表現 preg_match関数 文字列の集合を一つの文字列で表現する方法の一つ。 文字列のパターンマッチングで良く用いられる。 / /:スラッシュ内に含まれる文字列にマッチする。 [ ]:カッコ内の含まれる一文字にマッチする。 \:\以降の文字をエスケープする。 preg_match関数 preg_match(検索パターンの文字列, 対象文字列) If(preg_match("/[\\r\\n]/", $url) === 0) URLに\r\nが含まれており、同じ型である場合、 \r\n:HTTPの改行コード ===:等しく、および同じ型である場合に TRUE
動作確認 URL欄に次のURLを入力してみましょう ログインができず、攻撃サイトへ遷移しなければOKで す。 http://localhost/Web/Scenario121/EditSoft/shop.php ?page=2&login_id=yamada&password=P@ssword&u rl=welcome.php%0DSet- Cookie:+PHPSESSID=attackID;+PATH=/Web/Scenario1 21 ログインができず、攻撃サイトへ遷移しなければOKで す。
HTTPヘッダインジェクションの要点 HTTPヘッダインジェクションの脆弱性の原因は、ユー ザから受け取った入力値をそのまま使ってHTTPヘッダ を作成していることです。 HTTPヘッダインジェクションの攻撃を防ぐためには、 HTTPレスポンスヘッダに外部からのパラメータを使用 しない実装とするようにしましょう。また、HTTPレス ポンスヘッダに外部からのパラメータを使用する必要が ある場合は、取得したパラメータに対して改行コードを チェックする機能を実装する、あるいは改行コードをエ スケープ処理するようにしましょう。
課題 実際に、OSコマンドインジェクションまた はHTTPヘッダインジェクションの脆弱性を 突かれて被害を受けた事件を調査し、1) 被害の内容と時期、2)攻撃方法とその攻 撃で可能だったこと、3)脆弱性が生まれ た原因、4)実施された対策について、参 考にした情報源などを引用しつつ簡潔にま とめてください。 本講義の感想、要望、質問などあれば、書 いてください。 https://moodle.artsci.kyushu-u.ac.jp/course/view.php?id=2661