入力欄は、サイトの入口でもある
Webアプリの脆弱性テストとは、自分のサイトにわざと変な入力を入れて、弱点がないか確かめることです。入力欄は、ふつうの使い方だけでなく、悪用の入口にもなります。
この回では、よくある3つの弱点と、守る側のテストの進め方を学びます。
ラボのルール
注意
ラボの DVWA は、わざと弱く作った、あなた専用のコピーです。試してよいのは、このコピーだけです。許可なく他人のサイトに試すのは、不正アクセス禁止法に反します。目的は、守る側として弱点を知ることです。
このレッスンのゴール
メモ
自分のWebアプリで、よくある弱点を見つけて、種類に分けることができる。
キーワード
| ことば | いみ |
|---|---|
| 脆弱性 | 攻撃に使われてしまう、ソフトの弱点 |
| 入力値 | 利用者が、フォームやURLから入れる文字 |
| SQLインジェクション | 入力した文字が、データベースへの命令として動いてしまう弱点 |
| XSS | 入力した文字が、他の人のブラウザでプログラムとして動いてしまう弱点 |
| パラメータ化クエリ | 命令と入力値を、分けてデータベースに渡す書き方 |
| セキュリティレベル | DVWA が持つ、守りの強さの段階 |
学生が入力するセルは、このプレビューでは空白です。
入力を信用してはいけないのは、なぜか
Webアプリは、利用者の入力を使って、データベースに聞いたり、ページを作ったりします。入力が、仕組みの一部にそのまま入るのが問題です。
次のコードは、名前を文字列にそのままつなげて、命令を作っています。入力しだいで、命令の意味が変わるのを見てください。
入力で命令が変わるようす
# 命令を、文字列のつなぎ合わせで作る、危ない書き方です。
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つずつ試して、答えの変化を記録します。
弱点が見つかったら、セキュリティレベルを上げて、同じことをもう一度試します。何が変わったかが、直し方のヒントになります。
よくある間違い
注意
危ない文字を消せば、十分だと考える人がよくいます。文字の消し方には、必ず抜け道が見つかります。根本の直し方は、命令と入力値を分けて渡すことです。
守る書き方の形
# 命令は固定で書き、入力値は ? の場所に別に渡します。
cursor.execute("SELECT * FROM users WHERE name = ?", [name])
# こうすると、入力に引用符があっても、ただの文字として扱われます。
弱点ごとの守り方
| 弱点 | 守り方 |
|---|---|
| SQLインジェクション | パラメータ化クエリを使う |
| XSS | 出力するとき、特別な文字を無害な形に変える |
| パストラバーサル | 決めた場所の外のファイルは、開かない |
学生が入力するセルは、このプレビューでは空白です。
DVWA のラボの進め方
ブラウザの Open を押し、DVWA にログインします。まず、セキュリティレベルが低い状態で、1つの演習を調べます。
次に、レベルを高くして、同じ演習をもう一度試します。何が変わったか、コードの違いは何かを書いて提出します。