【Webアプリ開発】セキュリティ入門⑤ DVWAの活用方法の紹介
本記事は下記の記事の続きです。
前回の記事でDockerのインストールを行いましたので、本記事ではDockerを使ってDVWAを動かしてみます。
SQL Injection、XSS、CSRFを例にしてDVWAの活用方法について簡単に紹介します。
DVWAへの行き方
DVWAのリポジトリへの行き方ですが、検索を使うのが便利です。
「dvwa github」というワードで検索するとすぐに見つかります。
下記にリンクを貼っておきます。
DVWAを動かしてみよう
DVWAのリポジトリのREADMEにはDocker Containerに関する記述があります。
下記の赤線のコマンドを実行するだけでDVWAを動かすことができます。ただし、Ubuntu環境では「sudo」を前に付けます。
sudo docker run --rm -it -p 80:80 vulnerables/web-dvwa を実行します。
下記のようなメッセージが出れば無事にDVWAが起動しています。
ブラウザで「http://localhost」を入力すると下記のログインページに遷移します。
DVWAの始め方
下記の値を入力すればログインができます。
Username:admin
Password:password
ログインしたら下記の赤線のボタンを押してデータベースを作成します。
ログイン画面に遷移するため、再度ログインします。
DVWAのメイン画面に遷移します。
DVWA Securityとは
下記のDVWA Securityの箇所でセキュリティレベルを設定することができます。
セキュリティレベルのデフォルトは「low」です。
ここで左中段の脆弱性のボタンのどれか(下図ではSQL Injection)を押すとセキュリティレベルが「low」の脆弱性を体験することができます。
セキュリティレベルを「medium」に変更します。
ここで左中段の脆弱性のボタンのどれか(下図ではSQL Injection)を押すとセキュリティレベルが「medium」の脆弱性を体験することができます。
セキュリティレベルを「high」に変更します。
ここで左中段の脆弱性のボタンのどれか(下図ではSQL Injection)を押すとセキュリティレベルが「high」の脆弱性を体験することができます。
セキュリティレベルを「impossible」に変更します。
ここで左中段の脆弱性のボタンのどれか(下図ではSQL Injection)を押すとセキュリティレベルが「impossible」の脆弱性(脆弱性がない)を体験することができます。
View SourceとView Help
右下には「View Source」と「View Help」のボタンがあります。
「View Source」を押すと現在画面に表示されている脆弱性のソースコードを見ることができます。
「View Help」を押すと現在画面に表示されている脆弱性の簡単な解説を見ることができます。
SQL Injectionを体験しよう
セキュリティレベルが「low」と「impossible」でSQL Injectionを体験してみます。
Security Level : low
User IDに「1' or 'a'='a」と入力してSubmitを押します。
SQL Injectionの脆弱性があるため、下図のように全ユーザーの情報が出力されています。
Security Level : impossible
User IDに「1' or 'a'='a」と入力してSubmitを押します。
SQL Injectionの脆弱性がないため、全ユーザーの情報は出力されていません。
ソースコードを確認してみると、赤線箇所ではプレースホルダとバインドを使った処理を行っています。
IPAの「安全なウェブサイトの作り方」のSQL Injectionの箇所を確認してみます。
根本的解決の「1-(i)-a」に記載されているような実装がDVWAのSQL Injectionの「impossible」で行われていることがわかります。
クロスサイト・スクリプティング(XSS)を体験しよう
セキュリティレベルが「low」と「impossible」でXSSを体験してみます。
Security Level : low
What's your name?の箇所に「<script>alert("Hello")</script>」と入力してSubmitを押します。
XSSの脆弱性があるため、下図のようにJavaScriptが実行されています。
Security Level : impossible
What's your name?の箇所に「<script>alert("Hello")</script>」と入力してSubmitを押します。
XSSの脆弱性がないため、下図のようにJavaScriptは実行されていません。
ソースコードを確認してみると、赤線箇所ではPHPでエスケープ処理をするための関数(htmlspecialchars)が使用されています。
IPAの「安全なウェブサイトの作り方」のXSSの箇所を確認してみます。
根本的解決の「5-(i)」に記載されているような実装がDVWAのXSSの「impossible」で行われていることがわかります。
クロスサイト・リクエスト・フォージェリ(CSRF)を体験しよう
セキュリティレベルが「low」と「impossible」でCSRFを体験してみます。
Security Level : low
下図のフォームのHTMLを知るためにデベロッパーツールを開きます。
フォームは赤線のようなHTMLになっていることがわかります。
ここで下記のような内容のファイル(csrf_low.html)を作成します。
<form action="http://localhost/vulnerabilities/csrf" method="GET">
<input name="password_new"><br>
<input name="password_conf"><br>
<input type="submit" value="Change" name="Change">
</form>
csrf_low.htmlをブラウザで開いて、下図のように2箇所に「1234」を入力してChangeボタンを押します。
その結果、DVWAの画面に遷移します。(Password Changedと表示されているようにパスワードが「1234」に変更されました)
以上のように、CSRFの脆弱性があると、別のブラウザからのリクエストを受け付けて処理が行われてしまいます。
Security Level : impossible
下図のフォームのHTMLを知るためにデベロッパーツールを開きます。
フォームは赤線のようなHTMLになっていることがわかります。
ここで下記のような内容のファイル(csrf_impossible.html)を作成します。
<form action="http://localhost/vulnerabilities/csrf" method="GET">
<input name="password_current"><br>
<input name="password_new"><br>
<input name="password_conf"><br>
<input type="submit" value="Change" name="Change">
</form>
csrf_impossible.htmlをブラウザで開いて、下図のように最初に「1234」、残り2箇所に「5678」を入力してChangeボタンを押します。
その結果、CSRFトークンが不正である旨のメッセージが出ます。(パスワードは変更されません)
HTMLのコードをよく見ると下図の赤線箇所のようなhidden情報が追加されています。
ソースコードを確認してみると、赤線箇所ではトークンをチェックしています。
トークン関連の処理は「dvwaPage.inc.php」のファイルで実装されています。
赤線箇所がトークン関連の処理です。
IPAの「安全なウェブサイトの作り方」のCSRFの箇所を確認してみます。
根本的解決の「6-(i)-a」に記載されているような実装がDVWAのCSRFの「impossible」で行われていることがわかります。
以上、SQL Injection、XSS、CSRFを例にしてDVWAの活用方法について簡単に紹介しました。
DVWAのような脆弱性のあるアプリをうまく活用することで、Webアプリのセキュリティについての理解が深まりますので、積極的に活用していただければと思います。