BadLibraryは初めて脆弱性を探すのに最適な、小さくて簡単に動かせる脆弱なサンプルWebアプリケーションです。 node.jsだけ入っていれば特にそれ以外には何も必要なく動くので、BadStoreなどのようにVM環境を用意する必要もありません。
また、Webアプリケーションとして最小限の機能のみを備えているため、全体像の把握もしやすくなっています。
% https://github.com/SecureSkyTechnology/BadLibrary
% cd BadLibrary/src
% npm install
単純に src/app.js を起動するだけです。デフォルトでは8080でlistenします。
% npm start
または
% node app.js
で起動するので、Webブラウザで http://127.0.0.1:8080
などへアクセスしてください。
引数として -p
または --port
でポート番号を、 -h
または --host
でlistenするホストアドレスを指定することができます。
% node app.js -p 80
% node app.js --port 8080 --host 127.0.0.1
また、-c
あるいは --config
で設定ファイルを指定できます。省略時は同一ディレクトリ内の config.json
が読み込まれます。
% node app.js --config /tmp/config.json
デフォルトでユーザー名 user
パスワード pass
でBASIC認証がかけられています。BASIC認証が不要な場合は設定ファイルを編集してください。
また、利用できるユーザーは複数登録されていますが、利用者(練習用)としてはメールアドレス akita@example.jp
暗証番号 1234
を利用するといいでしょう。それ以外のアカウントについては、脆弱性を利用して利用してみましょう。
設定ファイル config.json
にて、サイト自体へのBASIC認証有無や含まれる脆弱性の有効無効を設定できます。
{
"global" : {
"basic" : "user:1234" // BASIC認証のユーザー名とパスワード
},
"vulnerabilities" : {
"sqli" : ["auth", "search", "blind"], // SQLインジェクション
"xss" : ["reflect", "dom" ], // XSS
"session" : [ "no-refresh", "no-httponly", "serial" ], //セッション情報の不備
"expose" : ["contaft", "dirindex", "admin"], // 情報の露出
"xxe" : true, // XXE
"csrf" : true // CSRF
}
}
global.basic
にユーザー名とパスワードを指定すると、BASIC認証が有効となりBadLibraryのサイトへアクセスする際にユーザー名とパスワードの入力を求められます。vulnerabilities.sqli
の要素に"auth"
を指定するとログイン画面のSQLインジェクションが有効となりSQLインジェクションによって認証をバイパスできます。vulnerabilities.sqli
の要素に"search"
を指定すると貸し出し履歴の画面でのSQLインジェクションが有効となります。vulnerabilities.sqli
の要素に"blind"
を指定すると書籍情報の画面でブラインドSQLインジェクションが有効になります。vulnerabilities.xss
の要素に"reflect"
を指定すると貸し出し履歴の画面での反射型XSSが有効になります。vulnerabilities.xss
の要素に"dom"
を指定すると404エラーページでのDOM-baed XSSが有効になります。vulnerabilities.session
の要素に"no-refresh"
を指定すると、ログイン後もセッションIDが変更されなくなります。vulnerabilities.session
の要素に"no-httponly"
を指定すると、セッションIDにhttponly属性が付与されなくなります。vulnerabilities.session
の要素に"serial"
を指定すると、セッションIDがハッシュ値ではなく連番で発行されるようになります。vulnerabilities.expose
の要素に"contact"
を指定すると、お問い合わせの内容のログが閲覧可能になります。(このオプションが指定されない場合はお問い合わせ内容は一切記録されません。)vulnerabilities.expose
の要素に"dirindex"
を指定すると、お問い合わせログのディレクトリインデックスが有効になります。vulnerabilities.expose = ["contact"]
も同時に指定する必要があります。vulnerabilities.expose
の要素に"admin"
を指定すると、誰でもログイン無しに管理画面にアクセス可能になります。vulnerabilities.xxe
にtrue
を指定すると、管理画面での書籍登録でXXEが有効になります。vulnerabilities.expose = ["admin"]
も同時に指定する必要があります。vulnerabilities.csrf
にtrue
を指定すると、お問い合わせ画面等でCSRFが有効になります。
BadLibraryには、OSコマンドインジェクションのように環境を破壊するものは含まれていません。また、データベースもreadonlyで開いていますのでデータベースが壊れるといったことも発生しません。そのため、1台のサーバーに対して複数人で同時にアクセスしても環境が壊れて診断が継続できなくなるということは通常はありません。 ただし、BadLibraryを誰でもアクセス可能な状態で公開する場合には以下の点に気をつけてください。
vulnerabilities.xxe = true
を指定してXXEが有効になっている場合には、サーバー上の機密情報が漏洩する可能性があります。vulnerabilities.expose = ["contact"]
を指定してお問い合わせログを閲覧可能にしている場合には、お問い合わせ内容として書き込んだ内容が漏洩する可能性があります。また、大量の書き込みによってサーバー上のディスクも消費する可能性があります。
これら以外にも、意図していない本来の意味での脆弱性が含まれる可能性もあります。
This software is released under the MIT License, see LICENSE.txt.