import urllib.request, ssl, paramiko, json, base64, bcrypt from cryptography.hazmat.primitives.serialization import load_der_public_key from cryptography.hazmat.primitives.asymmetric import padding BASE="http://sso.yunhaixingtong.com" HOST="sso.yunhaixingtong.com"; PORT=80 ctx=ssl.create_default_context(); ctx.check_hostname=False; ctx.verify_mode=ssl.CERT_NONE # ---- 1) known password + BCrypt hash (strength 10, prefix $2a$ to match Spring) ---- PLAIN="SsoTest@2026" h=bcrypt.hashpw(PLAIN.encode(), bcrypt.gensalt(rounds=10)).decode() if h.startswith("$2b$"): h=h.replace("$2b$","$2a$",1) print("BCrypt hash:", h) # ---- 2) insert temp user into bsch_userbase ---- ssh=paramiko.SSHClient(); ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect("192.168.10.157", port=22, username="yunhai", password="123456", timeout=20) def run(c): i,o,e=ssh.exec_command(c); return o.read().decode('utf-8','ignore')+("ERR:"+e.read().decode('utf-8','ignore') if e.read() else "") PWD="CVf^x$sW*b6CGHxh" USER="ssotest_tmp" run(f"docker exec mysql8 mysql -uroot -p'{PWD}' bsch_userbase -e \"DELETE FROM sys_user WHERE username='{USER}';\" 2>&1") ins=run(f"docker exec mysql8 mysql -uroot -p'{PWD}' bsch_userbase -e \"INSERT INTO sys_user(username,create_time,create_user,password,disabled,expired) VALUES('{USER}',NOW(),0,'{h}',0,0);\" 2>&1") print("INSERT result:", ins.strip()) # ---- 3) RSA public key ---- pub=json.loads(urllib.request.urlopen(urllib.request.Request(BASE+"/api/public-key"),timeout=20,context=ctx).read().decode())["data"]["publicKey"] der=base64.b64decode(pub) rsa_pub=load_der_public_key(der) def rsa_enc(s): return base64.b64encode(rsa_pub.encrypt(s.encode(), padding.PKCS1v15())).decode() # ---- 4) raw socket POST (native form, NO X-Requested-With) ---- def raw_post(headers_extra=None): body=f"loginname={rsa_enc(USER)}&pwd={rsa_enc(PLAIN)}" h={"Host":HOST,"Content-Type":"application/x-www-form-urlencoded", "Content-Length":str(len(body))} if headers_extra: h.update(headers_extra) req="POST /api/login HTTP/1.1\r\n"+"\r\n".join(f"{k}: {v}" for k,v in h.items())+"\r\nConnection: close\r\n\r\n"+body s=socket_create(); s.sendall(req.encode()) data=b"" while True: c=s.recv(4096) if not c: break data+=c s.close() return data.decode('utf-8','ignore') import socket def socket_create(): return socket.create_connection((HOST,PORT),timeout=20) print("\n=== SUCCESS login, NATIVE FORM (no XHR) -> expect 200 HTML w/ window.location.href ===") resp=raw_post() head=resp.split("\r\n\r\n",1)[0] print(head[:1200]) print("\n=== SUCCESS login, AJAX (X-Requested-With) -> expect JSON {code:0,data:{url}} ===") resp2=raw_post({"X-Requested-With":"XMLHttpRequest","Accept":"application/json"}) head2=resp2.split("\r\n\r\n",1)[0] print(head2[:800]) # cleanup run(f"docker exec mysql8 mysql -uroot -p'{PWD}' bsch_userbase -e \"DELETE FROM sys_user WHERE username='{USER}';\" 2>&1") print("\ncleanup done") ssh.close()