クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

自分のWebアプリの脆弱性テスト

このレッスンのあとで: 自分のWebアプリで、よくある弱点を見つけて、種類に分けることができる。

50分のレッスンコマンド2件DVWA のラボ:Damn Vulnerable Web Application で SQL インジェクションと XSS を練習する

入力欄は、サイトの入口でもある

Webアプリの脆弱性テストとは、自分のサイトにわざと変な入力を入れて、弱点がないか確かめることです。入力欄は、ふつうの使い方だけでなく、悪用の入口にもなります。

この回では、よくある3つの弱点と、守る側のテストの進め方を学びます。

ラボのルール

注意

ラボの DVWA は、わざと弱く作った、あなた専用のコピーです。試してよいのは、このコピーだけです。許可なく他人のサイトに試すのは、不正アクセス禁止法に反します。目的は、守る側として弱点を知ることです。

このレッスンのゴール

メモ

自分のWebアプリで、よくある弱点を見つけて、種類に分けることができる。

キーワード

ことばいみ
脆弱性攻撃に使われてしまう、ソフトの弱点
入力値利用者が、フォームやURLから入れる文字
SQLインジェクション入力した文字が、データベースへの命令として動いてしまう弱点
XSS入力した文字が、他の人のブラウザでプログラムとして動いてしまう弱点
パラメータ化クエリ命令と入力値を、分けてデータベースに渡す書き方
セキュリティレベルDVWA が持つ、守りの強さの段階

学生が入力するセルは、このプレビューでは空白です。

入力を信用してはいけないのは、なぜか

Webアプリは、利用者の入力を使って、データベースに聞いたり、ページを作ったりします。入力が、仕組みの一部にそのまま入るのが問題です。

次のコードは、名前を文字列にそのままつなげて、命令を作っています。入力しだいで、命令の意味が変わるのを見てください。

入力で命令が変わるようす

コード: python
# 命令を、文字列のつなぎ合わせで作る、危ない書き方です。
name = "ana"
query = "SELECT * FROM users WHERE name = '" + name + "'"
print(query)

# 次は、引用符を含む入力です。命令の形が変わります。
name = "x' OR '1'='1"
query = "SELECT * FROM users WHERE name = '" + name + "'"
print(query)

2つの出力は、何がちがうのか

1つ目は、ana という名前の人だけを探す命令です。2つ目は、引用符のおかげで、条件のあとに別の条件が付きました。

この条件は、いつも正しくなります。全員の行が返る可能性があります。入力が「データ」でなく「命令」になったのが原因です。

例: よくある3つの弱点

弱点原因起きること
SQLインジェクション入力が、データベースへの命令になる他の人のデータが読まれる
XSS入力が、ページの中のプログラムになる見た人のブラウザで勝手に動く
パストラバーサル入力が、ファイルの場所をたどる見せないファイルが読まれる

学生が入力するセルは、このプレビューでは空白です。

ラボのアプリが答えるか見る

コマンド
curl -s -o /dev/null -w '%{http_code}\n' http://dvwa/login.php

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

ログインページの題名を見る

コマンド
curl -s http://dvwa/login.php | grep -i "<title>"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

脆弱性テストは、どう進めるのか

まず、ふつうの入力で、ページが正しく動くのを確かめます。次に、変わった入力を1つずつ試して、答えの変化を記録します。

弱点が見つかったら、セキュリティレベルを上げて、同じことをもう一度試します。何が変わったかが、直し方のヒントになります。

よくある間違い

注意

危ない文字を消せば、十分だと考える人がよくいます。文字の消し方には、必ず抜け道が見つかります。根本の直し方は、命令と入力値を分けて渡すことです。

守る書き方の形

コード: python
# 命令は固定で書き、入力値は ? の場所に別に渡します。
cursor.execute("SELECT * FROM users WHERE name = ?", [name])
# こうすると、入力に引用符があっても、ただの文字として扱われます。

弱点ごとの守り方

弱点守り方
SQLインジェクションパラメータ化クエリを使う
XSS出力するとき、特別な文字を無害な形に変える
パストラバーサル決めた場所の外のファイルは、開かない

学生が入力するセルは、このプレビューでは空白です。

DVWA のラボの進め方

ブラウザの Open を押し、DVWA にログインします。まず、セキュリティレベルが低い状態で、1つの演習を調べます。

次に、レベルを高くして、同じ演習をもう一度試します。何が変わったか、コードの違いは何かを書いて提出します。

このラボとソースについて: DVWA のラボ:Damn Vulnerable Web Application で SQL インジェクションと XSS を練習する

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。