dvwa lowレベルテストソースコード構築リンク dvwa mediumレベルテストソースコード脆弱性利用 dvwa highレベルテストソースコード脆弱性利用 dvwa Impossibleレベルテストソースコード脆弱性利用 参照list tips 新しい知識ポイントリスト token php構文作用ショートリンク Anti-SRF token機構授権と未授権要求ドメインとCookie情報で指定するドメイン dvwa lowレベルテスト:
ソースコード
if( isset( $_GET[ 'Change' ] ) ) {
$pass_new = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ];
if( $pass_new == $pass_conf ) {
$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass_new = md5( $pass_new );
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert ) or die( ''
. ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '' );
//Feedback for the user
$html .= "Password Changed.
";
}
else {
//Issue with passwords matching
$html .= "Passwords did not match.
";
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?> $GLOBALS[“___mysqli_ston”] ???
$GLOBALS-グローバル ドメインで なすべての を
$GLOBALSというグローバル は、PHPスクリプト の の でグローバル にアクセスするために されます( またはメソッドから できます).
PHPは$GLOBALS[index]という にすべてのグローバル を している. の は のキーです.
MySQLConverter assumes that this global variable is set to equal your DB connection object; if the converter finds a mysql_connect it will (partially, but with a warning) convert your code into code that includes an assignment of $GLOBALS[“___mysqli_ston”] to the result of the mysqli_connect function something like this:
link=( GLOBALS[“___mysqli_ston”] = mysqli_connect( hostname, username, $pwd));
データベース に ?: の : ? 1: 2 : の の が の であり, を たす は 1, たさない は 2である. is_object()
- がオブジェクトであるかどうかを します.
リンクの
A) も な:
http://192.168.43.233/DVWA-master/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#
がこのリンクをクリックすると、 のパスワードはpasswordに されます(この は し に えますが、リンクは でパスワードを していることがわかります. がリンクをクリックすると、このページを ると のパスワードが ざんされていることがわかります).
はFirefoxブラウザでテストしていましたが、すでにFirefoxブラウザにdvwaのadminアカウントにログインしていましたが、パソコンのデフォルトブラウザはchromeなので、テスト のリンクの にcsrf を するために することはできませんでした.ブラウザによってクッキーが なるからです.
B)ショートリンクを ってURLを すことができます
ロングアドレスはhttp://suo.im/2n9XW2
C) ページの
な シーンでは、この は に に ページをアップロードし、 をだましてアクセスさせ、 が らないうちにCSRF を させる がある.ここではプレゼンテーションを にするためにtestをローカルに きます.html、 は なコードです.<img src="http://192.168.153.130/dvwa/vulnerabilities/csrf/?password_new=hack&password_conf=hack&Change=Change#" border="0" style="display:none;"/>
<h1>404<h1>
<h2>file not found.<h2>
がtestを するとhtmlの 、 がクリックしたのは なurlだと いしますが、 にCSRF を け、パスワードがhackに されています.
dvwa mediumレベルテスト:
ソースコード
if( isset( $_GET[ 'Change' ] ) ) {
if( eregi( $_SERVER[ 'SERVER_NAME' ], $_SERVER[ 'HTTP_REFERER' ] ) ) {
$pass_new = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ];
if( $pass_new == $pass_conf ) {
$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass_new = md5( $pass_new );
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert ) or die( ''
. ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '' );
//Feedback for the user
$html .= "Password Changed.
";
}
else {
//Issue with passwords matching
$html .= "Passwords did not match.
";
}
}
else {
//Didn't come from a trusted source
//HTTP_REFERERでSERVER_NAMEに 、 できないソース
$html .= "That request didn't look correct.
";
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>
Mediumレベルのコードが HTTP_をチェックしていることがわかりますREFERER(httpヘッダのReferパラメータの 、ソースアドレスを す)にSERVER_が まれているかどうかNAME(httpパケットヘッダのHostパラメータ、およびアクセスするホスト 、ここでは192.168.153.130)は、このメカニズムによってCSRF を ぐことを んでいる.
の
フィルタリングルールはhttpパケットヘッダのReferパラメータの にホスト を める があります
ホスト :http://192.168.43.233
ページの をホスト にすることができます.html
ネイティブユーザー:firefoxブラウザで マシン192.168.43.233のdvwa マシンにアクセス:192.168.43.153にtestがある.htmlページには コードがあり、パスワードをpassword 1に できます.
のあるページをクリックすると、パスワードがチュートリアルと なることに づき、 、 のmediumソースコードがチュートリアルと し なることに づいたので、チュートリアルに って のソースコードを しました.
、 で のあるマシンの ページをクリックすると、パスワードを できないことが しました.
のあるページ を します.htmlは192.168.43.233.html、パスワードの に しました
プロセス :
dvwa highレベルテスト:
ソースコード
のコードは きく されていませんが、 いは
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
generateSessionToken();
HighレベルのコードにはAnti-CSCF tokenメカニズムが み まれており、ユーザーが ページにアクセスするたびに、サーバはランダムなtokenを し、サーバに を する にtokenパラメータを する がありますが、サーバは を すると、tokenを にチェックし、tokenが である り、クライアントの を します. Anti-SRF tokenメカニズム? token?
Webセキュリティのtoken
の
Highレベルの CSRFメカニズムを するには、tokenを し、 のクッキーを してパスワードのページを してキーのtokenを することが です.
ページを し、 のサーバに し、 を してCSRF を させてみましょう.
の は、 がこのページにアクセスすると、スクリプトは えないフレームワークを じてパスワードを するページにこっそりアクセスし、ページのtokenを し、サーバーに を してCSRF を することである.
しかし、 と の は きく、ここではドメイン の に していますが、 のブラウザではドメイン リクエストは されていません.ここでは、ドメイン で に します. たちのフレームワークiframeがアクセスするアドレスはhttp://192.168.153.130/dvwa/vulnerabilities/csrf
で、サーバー192.168.153.130にあります. たちの ページはハッカーサーバー10.4.253.2にあります. のドメイン は なり、ドメイン Bの のすべてのページは、ドメイン Aの のページの を に することはできません.ドメイン Aの のページがドメイン Bのページに に を しない り、だから たちの スクリプトは、 インタフェースのuser_を することはできません.token.
ドメイン では できないため、ターゲットサーバ192.168.153.130に コードを してこそ、 を することができます.
、HighレベルのXSS を してAnti-CSCF tokenの に する(ここでのXSS は さ があり、 な スクリプトを できないため、Anti-CSCF tokenのみを する).
xss token
ページで、
データベースで、
すなわち, さに がなければ,ユーザのtokenを しながら, を うことができる.
dvwa Impossibleレベルテスト:
ソースコード
if( isset( $_GET[ 'Change' ] ) ) {
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
$pass_curr = $_GET[ 'password_current' ];
$pass_new = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ];
$pass_curr = stripslashes( $pass_curr );
$pass_curr = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_curr ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass_curr = md5( $pass_curr );
$data = $db->prepare( 'SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );
$data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );
$data->bindParam( ':password', $pass_curr, PDO::PARAM_STR );
$data->execute();
if( ( $pass_new == $pass_conf ) && ( $data->rowCount() == 1 ) ) {
$pass_new = stripslashes( $pass_new );
$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass_new = md5( $pass_new );
$data = $db->prepare( 'UPDATE users SET password = (:password) WHERE user = (:user);' );
$data->bindParam( ':password', $pass_new, PDO::PARAM_STR );
$data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );
$data->execute();
$html .= "Password Changed.
";
}
else {
//Issue with passwords matching
$html .= "Passwords did not match or current password incorrect.
";
}
}
//Generate Anti-CSRF token
generateSessionToken();
?>
ImpossibleレベルのコードはPDO を してSQL を し,CSRFを するにはユーザに のパスワードを するように し( で ), は のパスワードを らない ,どうしてもCSRF を うことができない.
の
None
リスト:
ガイド:DVWA-1.9フルレベルチュートリアルのCSRF
tips:
にチュートリアルに って、CSRFに して な があります.
しいナレッジポイントリスト:
1.token
2.php :?:こうぶんさよう
3.ショートリンク
4.Anti-CSCF token
5. と
web security で されています
6. ドメインとCookie で されたドメイン?ドメイン?