概要
このエントリには問題サーバの解説、想定される脆弱性について記述する。
万が一このページが流出した時の為に、レポートの内容は一切載せない。
納期は 2017年11月14日(火)24:00 !!!!!!
配布物リンク
MBSD配布物リンク (もうない)
今回の問題形式について
脆弱性の探し方
- 今回はAPIサーバの脆弱性を使うので、OWASP ZAP等のツールはあまり使えなそう
- 脆弱性とは何もセキュリティホールだけでは無く、完全性、機密性、可用性を脅かすもの
- 些細なバグでも良いのでとにかくいろいろ試す
- リクエストを改変出来る BurpSuite があると便利かも?
レポートの書き方
項目
- 対象 機能名 URL
- 危険度 High Medium Low
- 解説 再現方法 レスポンス
- 想定される被害 / 影響
- 対策
- 備考
例文
問題サーバ全体像

API一覧
- ★が付いてる操作はSESSIONIDをサイト上部のフォームに入力する必要がある。
- SESSIONIDはログインすると取得出来る
- OTP取得はアカウントのトークンシードをコピペしてから実行して生成する
- modeはAPIにおける機能名
| 操作 |
mode |
解説 |
| ログイン |
login |
SESSIONIDを取得出来る (アクティベート済みのアカウントじゃないとダメ) |
| 口座開設申請 |
register |
申請するだけで他に使う機会は無いはず |
| アクティベート |
activate |
アカウントをアクティベート(有効化)する |
| 銀行情報取得 |
banklist |
銀行名と銀行コードを取得出来る (入力空で全情報取得可能) |
| 支店情報取得 |
branchlist |
銀行コードと支店名と支店コードを取得出来る (入力空で全情報取得可能) |
| ★ユーザ情報取得 |
user |
ユーザIDと名前が取得出来る |
| ★振込処理登録 |
transfer |
振込処理登録を行いtokenを取得する、この時点ではまだ振り込まれない (1つまでしか登録出来ない) |
| ★振込処理 |
verify |
振込処理登録で取得したtokenを入力すると、それに対応する振込処理が行われる |
| ★振込待ち処理表示 |
transactionlist |
振込待ちのtoken一覧を表示する |
| ★通帳処理 |
passbook |
振込処理の履歴(通帳)が見れる |
| ★ログアウト |
logout |
SESSIONIDを破棄する |
APIドキュメント詳細は Googleドライブにどこからでも見れるように上げた。
ユーザが出来ること
- ログイン・ログアウト
- 振込 ( 登録・予約確認・処理・履歴確認 )
- ユーザ・銀行・支店情報取得
- 口座有効化
- 口座開設 (意味ない(はず))
利用フロー
- intro.html を見る
- アクティベート済みアカウントでログイン
- 取得したSESSIONIDで操作
各種バージョン情報
| ミドルウェア名 |
バージョン |
| CentOS7 |
カーネル 3.10.0-693.2.2.el7.x86_64 |
| Apache |
不明 |
| PHP |
5.6.31 |
| MySQL |
不明 |
ソースコードについて
ディレクトリ
| ディレクトリ名 |
役割 |
| lib |
オープンソース?のライブラリがある |
| mode |
各APIの実装がある |
| test |
APIを試すための場所 |
| tmp |
SESSIONIDを保存する場所 |
| util |
SQLとか暗号化とかのユーティリティファイルがある |
ルートディレクトリにあるファイル
| ファイル名 |
役割 |
| consts.php |
定数定義 |
| utils.php |
utilディレクトリのPHPコードを読み込む、consts.phpとlib/base32.phpを読み込んでいる |
| index.php |
全てのAPIの入り口、utils.phpを読み込んでる |
| phpinfo.php |
PHPの設定情報が見れる |
| sql.sql |
DBの定義と初期値が見れる |
処理の流れ
ユーザのリクエスト
↓
index.phpでmode判定して、対応する /mode/*.php を読み込む
↓
/mode/*.php 内の $ret に処理内容を無名関数で定義
↓
index.php で $ret を実行、$ret の中でJSONレスポンスを記述
ソースコードの解説コメント
配布されたソースコードに解説コメントを追加した物をGitHubのprivateリポジトリに上げた。
見たかったらかわしにアカウントを教えて貰えれば見れるようにする。
DB定義
banks(銀行)
| カラム名 |
役割 |
| id |
id |
| name |
銀行名 |
| code |
銀行コード |
| endpointurl |
各社銀行のAPI |
| charge |
振込時の手数料 |
branch(支店)
| カラム名 |
役割 |
| id |
id |
| bank_code |
銀行コード |
| name |
支店名 |
| code |
支店コード |
transaction(トランザクション)
| カラム名 |
役割 |
| id |
id |
| to_user_id |
振込先ユーザID |
| to_bank_code |
振込先銀行コード |
| to_branch_code |
振込先支店コード |
| to_bankcode |
振込先口座番号 |
| from_user_id |
振込元ユーザID |
| from_bankcode |
振込元口座番号 |
| from_bank_code |
振込元銀行コード |
| from_branch_code |
振込元支店コード |
| value |
振込額 |
| token |
トランザクションtoken |
| charge |
手数料 |
transferlog(トランザクションログ、通帳)
| カラム名 |
役割 |
| id |
id |
| to_user_id |
振込先ユーザID |
| to_bank_code |
振込先銀行コード |
| to_branch_code |
振込先支店コード |
| to_bankcode |
振込先口座番号 |
| from_user_id |
振込元ユーザID |
| from_bank_code |
振込元銀行コード |
| from_branch_code |
振込元支店コード |
| from_bankcode |
振込元口座番号 |
| value |
振込額 |
| reason |
振込理由 |
| timestamp |
タイムスタンプ |
users(ユーザ情報)
| カラム名 |
役割 |
| id |
id |
| bankcode |
口座番号 |
| activate |
アクティベート済みかどうか |
| loginid |
ログインに仕様するID |
| branch_code |
支店コード |
| password |
パスワード |
| name_sei |
名前(姓) |
| namae_mei |
名前(名) |
| name_sei_kana |
名前(姓(カナ)) |
| name_mei_kana |
名前(名(カナ)) |
| balance |
残高 |
| otpbase |
OTPの何か |