This post is Private. Only a writer or those who know its URL can access this post.
More than 1 year has passed since last update.

概要

このエントリには問題サーバの解説、想定される脆弱性について記述する。
万が一このページが流出した時の為に、レポートの内容は一切載せない。

納期は 2017年11月14日(火)24:00 !!!!!!

配布物リンク

MBSD配布物リンク (もうない)

今回の問題形式について

  • 提供されたのはAPIサーバとAPIを叩く為だけにある簡単なサイト1ページ
  • APIサーバについてはググれ
  • 問題はネット銀行サービスのAPIを想定している
  • 運営が用意した http://192.168.56.101/test/ で確認出来る

脆弱性の探し方

  • 今回はAPIサーバの脆弱性を使うので、OWASP ZAP等のツールはあまり使えなそう
  • 脆弱性とは何もセキュリティホールだけでは無く、完全性、機密性、可用性を脅かすもの
  • 些細なバグでも良いのでとにかくいろいろ試す
  • リクエストを改変出来る BurpSuite があると便利かも?

レポートの書き方

項目

  • 対象 機能名 URL
  • 危険度 High Medium Low
  • 解説 再現方法 レスポンス
  • 想定される被害 / 影響
  • 対策
  • 備考

例文

  • 対象 Banklist http://192.168.56.101/index.php
  • 危険度 High
  • 解説 正常パラメータ / 異常パラメータ / レスポンス
  • 被害・影響 DBが改ざんされる
  • 対策 プレースホルダ、validation
  • 備考 特になし

問題サーバ全体像

MBSD2017全体像.png

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ドライブにどこからでも見れるように上げた。

ユーザが出来ること

  • ログイン・ログアウト
  • 振込 ( 登録・予約確認・処理・履歴確認 )
  • ユーザ・銀行・支店情報取得
  • 口座有効化
  • 口座開設 (意味ない(はず))

利用フロー

  1. intro.html を見る
  2. アクティベート済みアカウントでログイン
  3. 取得した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リポジトリに上げた。
見たかったらかわしにアカウントを教えて貰えれば見れるようにする。

https://github.com/kawashi/MBSD-2017

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の何か
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.