sakmt / web-vuln-example

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

脆弱なウェブアプリケーションのサンプル

基本的なウェブアプリケーションセキュリティの学習用サンプルアプリケーションです。

動作環境

  • PHP 5.4.x 以上
    • PDO の SQLite ドライバが必要

インストール

$ make install

実行

以下のコマンドを実行したのち、ブラウザから http://localhost:8888/ にアクセスしてください。

$ make server

localhost:8888 以外のホスト名とポート番号の組み合わせでサーバを起動したい場合は、以下のようにして希望するホスト名とポート番号を指定してください。

$ SERVER_HOST=127.0.0.1 SERVER_PORT=8889 make server

体験できる脆弱性

いまのところ、以下の脆弱性が体験できるように作っています。

  • ログイン画面 (等) における SQL Injection 脆弱性
  • ログイン画面における XSS 脆弱性
  • 「ぼやき」のタイムライン表示における XSS 脆弱性
  • 「ぼやき」の投稿フォームにおける XSS 脆弱性
  • 「ぼやき」の投稿処理における CSRF 脆弱性

このアプリケーションの構成について

主要ファイル、ディレクトリ構成

以下のようなディレクトリ構成を取っています (ここに書かれていないものは気にしなくてよいです)。

.
├── src …… ライブラリ類 (ディレクトリ構成は PSR-4 準拠 / see also: http://www.php-fig.org/psr/psr-4/)
│   └── Example
│        ├── Controller
│        │   ├── ActivityController.php …… アクティビティ系のリクエストを扱うコントローラ (ホーム画面も含まれる)
│        │   └── LoginController.php …… ログイン系のリクエストを扱うコントローラ
│        └── Repository
│             ├── Activity.php …… アクティビティ系のデータを操作するクラス
│             └── User.php …… ユーザ系のデータを操作するクラス
├── tests …… テスト (気にしてほしいけれども気にしなくてよい)
├── views …… テンプレートファイル群
│   ├── _base.twig …… 全ページ共通で読み込まれるテンプレートファイル
│   ├── home.twig …… ホーム画面のテンプレートファイル
│   └── login.twig …… ログイン画面のテンプレートファイル
└── web …… Web 公開用ディレクトリ
    ├── activity.js …… ホーム画面で表示されるアクティビティ関連のライブラリ
    ├── enquiry-form.php …… お問い合わせフォーム (このページだけなぜかわざとらしく素の PHP で書かれていて怪しいですね)
    └── index.php …… すべてのリクエストの入り口となるフロントコントローラ

サンプルアプリケーションの動作フロー

  • すべてのリクエストは web/index.php で受けることになります。 web/index.php には受け付けるべきリクエストのパターン (リクエストメソッド、パス名) が定義されており、それぞれの定義に一致するリクエストであった場合は、あらかじめ決められたメソッドにリクエストを処理させます
  • たとえば $app->get('/', 'controller.activity:home') は、 GET メソッドで / に対してリクエストした場合に、 controller.activity:home にて表されるメソッドにその処理を担当させることになります。 controller.activity はクラスを表し、 : の後に続く home はそのクラスのインスタンスメソッド名と一致します。 controller.activity および controller.login がどのクラスであるかは config.php に定義されており、それぞれ Example\Controller\ActivityControllerExample\Controller\LoginControllerとなります
  • したがって GET / HTTP/1.1$app->get('/', 'controller.activity:home') によって定義されたとおり、 Example\Controller\ActivityController クラスのインスタンスの home() メソッドによって処理されることになります
  • リクエスト契機で呼び出されるコントローラの各メソッドではレスポンスを返すことのみが決まっており、それ以外にどのような処理をおこなうのかは未定義 (各メソッドに委ねられている) ですが、主に以下のようなことをおこなっています
    • リクエストパラメータに応じた任意の処理
    • SQLite の DB 上のデータを操作 (Example\Repository\UserExample\Repository\Activity のメソッドによっておこなっています)
    • レスポンスボディとなるべき HTML を構築 (Twig によって views/ 以下のテンプレートファイルを読み込むことによって実現しています。読み込むべきテンプレートファイル名は都度コントローラ側にて指定されています)

About

License:Apache License 2.0


Languages

Language:JavaScript 79.6%Language:PHP 18.7%Language:CSS 1.5%Language:Makefile 0.2%