ファイル名の変更などシステムを不正に操作する

サイバーセキュリティ演習
― 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の操作を可能にするプログラム
(シェル)が提供されている。
アプリケーション/ソフトウェア
OS
シェル
カーネル
システムコール
プロセス管理
メモリ管理
デバイス管理
デバイスドライバ
Hardware
CPU/メモリ
HDD
NIC
OSコマンドの例
 ファイルやディレクトリの一覧を表示
 Windows: dirコマンド
dir /b
 Linux: lsコマンド
ls -l
 ファイル名の変更
 Windows: renameコマンド
rename [対象のファイル名] [変更後のファイル名]
 Linux: mvコマンド
mv [対象のファイル名] [変更後のファイル名]
演習テーマ
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の入力として実行する。
 コマンド < ファイル
 コマンドの入力をファイルから読み取る。
 コマンド > ファイル
 コマンドの出力をファイルへ書き出す。
演習内容(疑似的な攻撃)
 ネットショッピングに対して、不正なOSコマンドを入
力し、Cドライブ直下のファイル名とフォルダ名の一覧
を取得する
 脆弱性があるウェブサイト
 ネットショッピング
演習の進め方
1. Webサイトの挙動を把握する
2. 脆弱性となる箇所を特定する
3. 不正なOSコマンドを考える
4. 不正に情報を取得する
1.Webサイトの挙動を把握
する
 ネットショッピングにロ
グインID「suzuki」、パ
スワード
「Administr@tor」でロ
グインして、商品管理
ページでファイル名を変
更できることを確認。
 攻撃者として、利用でき
ることを考える。
 ファイル名変更後のURL
も確認しましょう。
2.脆弱性となる箇所を特定す
る
 変更後のファイル名にexample.txt &を入力してみる
 正常(エラー)
 脆弱性あり( 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()関数
 外部プログラムを実行し、出力を表示する
その他にもexec()関数やshell_exec()関数などもある
 system(OSコマンド)
renameコマンドの場合、
<?php
$filename = [変更後のファイル名];
rename("test.txt", $filename);
?>
代替え可能なPHP関数の例
 OSコマンド
 ファイルの削除
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
1. ファイル名変更画面処理の内容の確認。
2. system関数を使用する箇所の特定。
3. 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();
return;
}
ファイル名変更要求時のパラメー
タ取得
$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);
} else {
$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サーバに要求する。
 Webサーバから処理結果としてHTTPレスポンスが返ってくる。
 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
の値を書き換えることにより、ユーザになりすまし
不正行為を行う
参考:セッションIDとCookie
 セッションIDはWebサーバが発行するセッションの識別。
 セッション変数はセッションIDと関連パラメータ(ログイ
ンIDや日付など)を紐づけした情報を格納する領域
 Cookieはブラウザが保持するセッションID。
ログイン情報送信
クライアント
Cookieに保存
されたのセッ
ションIDを送信
セッションIDを発行
該当するユーザ専用ページを送付
ログイン済みのアクセス
該当するページを送付
ID・パスワード認証
セッション変数格納
Webサーバ
セッション変数参照
セッションID検証
Webサーバ
演習内容(疑似的な攻撃)
 ネットショッピングに対して、HTTPヘッダ内容を変更
する不正なURLを入力し、Cookieの値を変更する
 脆弱性があるウェブサイト
 ネットショッピング
演習の進め方
1. Webサイトの挙動を把握する
2. Cookieを書き換える不正のHTTPヘッダを考える
3. 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%0DSetCookie:+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の処理内容をゲット
メッセージ割り当て
テンプレート表示
 shop121.class.php
ネットショッピングのデータの初期設定
ログイン処理
 welcome.php
ログイン成功後の遷移画面
脆弱性の修正の手順
 shop121.class.php
1. ログイン処理の内容の確認。
2. 改行コードのチェックが必要な箇所の特定。
3. 改行コードチェック機能の実装。
1.ログイン処理の内容の確認
public function login()
{
$param = $this->get_param();
$result = parent::login();
遷移先のURLをGETパ
ラメータで取得
$url = $_GET["url"];
if ($result) {
header ("Location: ". $url);
exit;
}
return $result;
}
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.改行コードチェック機能の
実装
public function login()
{
$param = $this->get_param();
$result = parent::login();
$url = $_GET["url"];
if ($result) {
preg_match関数で
正規表現によるマッチングを行う
if (preg_match("/[\\r\\n]/", $url) === 0) {
header ("Location: ". $url);
exit;
} else {
parent::proc_logout_headerinjection();
}
}
return $result;
}
正規表現によるマッチングの条件に合わなければ、
インジェクション攻撃を受けた場合のログアウト処理
Scenario_Shop/base_shop.class.phpの
proc_logout_headerinjection()を実行
正規表現
 文字列の集合を一つの文字列で表現する方法の一つ。
 文字列のパターンマッチングで良く用いられる。
 / /:スラッシュ内に含まれる文字列にマッチする。
 [ ]:カッコ内の含まれる一文字にマッチする。
 \:\以降の文字をエスケープする。
 preg_match関数
preg_match(検索パターンの文字列, 対象文字列)
 If(preg_match("/[\\r\\n]/", $url) === 0)
 URLに\r\nが含まれており、同じ型である場合、
\r\n:HTTPの改行コード
===:等しく、および同じ型である場合に TRUE
動作確認
 URL欄に次のURLを入力してみましょう
 http://localhost/Web/Scenario121/EditSoft/shop.php
?page=2&login_id=yamada&password=P@ssword&u
rl=welcome.php%0DSetCookie:+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