讲在前面
暴力破解本身是一个技术含量比较低的手段,即通过穷举所有有可能的字段进行尝试,找到一个正确的结果,从而达到破解的效果。
我个人觉得,暴力破解的难点在于没有一份强大的字典文件去遍历,其次是遍历的时间一般会比较长,在实战中暴力破解一般会是个最差解。
一、Low
1.1 先看代码:
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);
这段代码的意思是:
- 如果请求包get的内容是login的话,接收username和password两个参数,对password计算md5摘要
- 构建sql语句,并发送到数据库进行查询
- 解析返回结果
从代码可以看到,服务器端对输入没有任何验证,因此不仅可以暴力破解,直接注入都是行得通的:
(这里主要是在sql里面and比or的优先级高,所以运算出的结果是true)
1.2 爆破
打开burpsuite,设置代理,然后开始抓包。
用户名输入admin,密码随意,这里输入123456,抓到的包丢进Intruder:
payload选择simple list,然后开始攻击:
可以看到,就password的反应包长度不一样,经手工验证,password即为正确的密码。
二、Medium
2.1 代码
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 ) :