目录
Brute Force
这是一道暴力破解的题目。
low
一、开启burp
,打开代理
二、此处我在火狐浏览器中安装了插件,如果没有插件的可以在设置中进行代理选择,其他浏览器也相似,现在进行浏览器的代理设置
1)点击设置
2)滑到最底部选择设置
3)进行图中的相应设置(此处因为安装了插件,所以会变成灰色,正常情况下是可选的状态)。
三、随便输入账号和密码,点击Login
,就会跳转到burp
里面,然后我们将包发送到Intruder
模块。
因为burp会默认选中一些攻击参数,所以我们要先将其清除。
然后我们选中要进行爆破的参数,点击Add
即可选中(因为这里只是做演示,就只做一个点的爆破,我将账号修改为admin了)。
之后我们选择payloads
四、查看一下源码,发现没有任何的防护措施
<?php
if( isset( $_GET[ 'Login' ] ) ) {
// Get username
$user = $_GET[ 'username' ];
// Get password
$pass = $_GET[ 'password' ];
$pass = md5( $pass );
// Check the database
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
if( $result && mysqli_num_rows( $result ) == 1 ) {
// Get users details
$row = mysqli_fetch_assoc( $result );
$avatar = $row["avatar"];
// Login successful
echo "<p>Welcome to the password protected area {$user}</p>";
echo "<img src=\"{$avatar}\" />";
}
else {
// Login failed
echo "<pre><br />Username and/or password incorrect.</pre>";
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>
Medium
medium模式与Low差别不大,查看源码我们会发现,只是输错密码后会禁止2秒钟,但是这样的禁止模式没有多大的用处。
<?php
if( isset( $_GET[ 'Login' ] ) ) {
// Sanitise username input
$user = $_GET[ 'username' ];
$user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
// Sanitise password input
$pass = $_GET[ 'password' ];
$pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass = md5( $pass );
// Check the database
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
if( $result && mysqli_num_rows( $result ) == 1 ) {
// Get users details
$row = mysqli_fetch_assoc( $result );
$avatar = $row["avatar"];
// Login successful
echo "<p>Welcome to the password protected area {$user}</p>";
echo "<img src=\"{$avatar}\" />";
}
else {
// Login failed
sleep( 2 );
echo "<pre><br />Username and/or password incorrect.</pre>";
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>
High
一、我们抓包会发现多了一个token
值,但是burp里面有一个进行token爆破的模块
二、将包发送到攻击模块
三、选中要爆破的密码和token模块
,然后选择Pitchfork
四、然后到payloads
和options
中进行配置
1)载入字典
2)然后找到Grep - Extract
,点击Add
(注意的是,这里的线程还要调为1)
3)点击Refetch
,选择token值
4)选择2攻击点,选择Recursive grep
模块,点击开始攻击即可
5)测试结果(因为有时候比较难以判断),测试的方法与Low级别的测试相同
五、源码分析
<?php
if( isset( $_GET[ 'Login' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// Sanitise username input
$user = $_GET[ 'username' ];
$user = stripslashes( $user );
$user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
// Sanitise password input
$pass = $_GET[ 'password' ];
$pass = stripslashes( $pass );
$pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass = md5( $pass );
// Check database
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
if( $result && mysqli_num_rows( $result ) == 1 ) {
// Get users details
$row = mysqli_fetch_assoc( $result );
$avatar = $row["avatar"];
// Login successful
echo "<p>Welcome to the password protected area {$user}</p>";
echo "<img src=\"{$avatar}\" />";
}
else {
// Login failed
sleep( rand( 0, 3 ) );
echo "<pre><br />Username and/or password incorrect.</pre>";
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
// Generate Anti-CSRF token
generateSessionToken();
?>
其实就是加入了token值进行保护,但是还是不够完善
XSS(DOM)
这是一道DOM型的XSS注入的题目。
low
一、直接点击select,发现提交的内容在网址中显示,所以我们可以得知这是一个GET
请求
二、直接来测试是否存在XSS漏洞
,上payload,发现存在XSS漏洞
payload:
源码分析,这是真的什么都没有啊。
<?php
# No protections, anything goes
?>
Medium
一、还是一样,参试一下<script>alert(123)</script>
,发现什么反应都没有,查看一下源码吧
二、源码分析
<?php
// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
$default = $_GET['default'];
# Do not allow script tags
//我们发现这里把<script给过滤了
if (stripos ($default, "<script") !== false) {
header ("location: ?default=English");
exit;
}
}
?>
那么我们难道就没有其他办法了吗?当然有,而且还有很多种方法进行绕过,这里我们先看看前端代码吧。
我们是不是可以构造一个让select和option提前闭合的变量,然后在其后面加上img标签进行XSS攻击,不废话了,直接上payload。
payload:
这里要注意的是,鼠标要移到损坏的图片上方才会触发XSS。
High
一、直接使用<script>alert(1)</script>
也还是没用,毕竟人家也是一个High级别的,怎么可能犯这种错误了
二、我们查看前端的代码,发现和Medium模式的是一样的,我们参试一下Medium模式下的payload,但是发现也没有用
三、查看源码,分析一下
<?php
// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
# White list the allowable languages
# 我们在这里发现只能进行这些匹配
switch ($_GET['default']) {
case "French":
case "English":
case "German":
case "Spanish":
# ok
break;
default:
header ("location: ?default=English");
exit;
}
}
?>
虽然只有这些匹配,但是我们是不是可以使用&&进行连接?当然是可以的啊!
payload:&&
如果文章有何不妥之处,请您指出。
更多的DVWA靶场解题思路更新中,敬请期待……