
<a href="#MIDDLE" ><h3>点击跳转到MIDDLE级别</h3></a><a href="#HIGN"><h3>点击跳转到HIGN级别<h3></a>
LOW级别:
1.编写如下html页面:
image.png
2.诱使用户去点击它:
image.png
3.检查数据库中的user表:
image.png
4.MD5值:
image.png
可见在点击的过程中html页面请求了一处url并触发了一个恶意的动作。
<a id="MIDDLE">--------------------------------------------------------------------------------------------------------------------</a>
MIDDLE级别:
<?php
if( isset( $_GET[ 'Change' ] ) ) {
// Checks to see where the request came from
if( eregi( $_SERVER[ 'SERVER_NAME' ], $_SERVER[ 'HTTP_REFERER' ] ) ) {
// Get input
$pass_new = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ];
// Do the passwords match?
if( $pass_new == $pass_conf ) {
// They do!
$pass_new = mysql_real_escape_string( $pass_new );
$pass_new = md5( $pass_new );
// Update the database
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
$result = mysql_query( $insert ) or die( '<pre>' . mysql_error() . '</pre>' );
// Feedback for the user
echo "<pre>Password Changed.</pre>";
}
else {
// Issue with passwords matching
echo "<pre>Passwords did not match.</pre>";
}
}
else {
// Didn't come from a trusted source
echo "<pre>That request didn't look correct.</pre>";
}
mysql_close();
}
?>
Medium级别的代码检查了保留变量 HTTP_REFERER即Referer参数的值,观察来源地址中是否包含SERVER_NAME:
打开apache下的httpd.conf文件可知该值为 loclahost:80 :
image.png
因为有了IP来源的限制:
把192.168.1.1改为了localhost:80即可绕过....
image.png
如果不修改IP来源则会跳到登陆页面:
image.png
<a id="HIGN">--------------------------------------------------------------------------------------------------------------------</a>
HIGN级别:
<?php
if( isset( $_GET[ 'Change' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// Get input
$pass_new = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ];
// Do the passwords match?
if( $pass_new == $pass_conf ) {
// They do!
$pass_new = mysql_real_escape_string( $pass_new );
$pass_new = md5( $pass_new );
// Update the database
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
$result = mysql_query( $insert ) or die( '<pre>' . mysql_error() . '</pre>' );
// Feedback for the user
echo "<pre>Password Changed.</pre>";
}
else {
// Issue with passwords matching
echo "<pre>Passwords did not match.</pre>";
}
mysql_close();
}
// Generate Anti-CSRF token
generateSessionToken();
?>
High级别的代码加入了Anti-CSRF token机制,用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。