前提
- kali linux環境がある
- DVWAのセットアップ済み
- 初級レベル理解済み
目標
- 脆弱性の理解を深める。
手順概要
- 大まかな挙動を把握する
- コードを見て脆弱性をみつける
- コードの脆弱性を攻撃する
内容
###挙動の把握
low
- 入力値がクエリに乗っかりGETを投げる
- sqlの結果が全て下部に転写される
medium
- selectBoxのoption値をPOST
- sqlの結果が全て下部に転写される
high
- クリックすると別windowが開く
- 別windowでidを入力
- 元の画面にsqlの結果が全て下部に転写される
コードを確認
low
- 入力値がそのまま格納される。
<?php
$id = $_REQUEST[ 'id' ];
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
?>
medium
- urlからの入力や、文字列の直接入力はできない。
- mysqli_real_escape_stringで特殊文字をエスケープ
<?php
$id = $_POST[ 'id' ];
$id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);
$query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
?>
high
- 文字のエスケープはない。
- 別画面で入力したIDを読み取る。(別画面と元の画面の双方がないと表示できない)
- limit 1で1つだけ表示になっている。
<?php
// Get input
$id = $_SESSION[ 'id' ];
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
?>
impossible
- tokenチェック
- is_numericで数値かどうかの判定
<?php
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// Get input
$id = $_GET[ 'id' ];
// Was a number entered?
if(is_numeric( $id )) {
// Check the database
}
?>
脆弱性を攻撃する
low
- 防御無しのため、ストレートに攻撃する。
1' or 'a'='a
medium
- 特殊文字はエスケープされるので、特殊文字は使用しない。
1 or true
high
- limit 1を外したいので#でコメントアウトする
- 特殊文字はエスケープされていないのでそのままでいく。
1' or 'a'='a' #
impossible
- 無理っぽい