import urllib.request, ssl, paramiko, json, base64, bcrypt, socket 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 PLAIN="SsoTest@2026" h=bcrypt.hashpw(PLAIN.encode(), bcrypt.gensalt(rounds=10)).decode() if h.startswith("$2b$"): h=h.replace("$2b$","$2a$",1) USER="ssotest_tmp" 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" # write SQL via sftp (avoid shell $ expansion of the BCrypt hash) seed=f"DELETE FROM sys_user WHERE username='{USER}';\nINSERT INTO sys_user(username,create_time,create_user,password,disabled,expired) VALUES('{USER}',NOW(),0,'{h}',0,0);\n" sftp=ssh.open_sftp(); sftp.open('/tmp/seed.sql','w').write(seed); sftp.close() print("seed.sql:\n", seed) print("import result:", run(f"docker exec -i mysql8 mysql -uroot -p'{PWD}' bsch_userbase < /tmp/seed.sql 2>&1").strip()) pub=json.loads(urllib.request.urlopen(urllib.request.Request(BASE+"/api/public-key"),timeout=20,context=ctx).read().decode())["data"]["publicKey"] rsa_pub=load_der_public_key(base64.b64decode(pub)) def rsa_enc(s): return base64.b64encode(rsa_pub.encrypt(s.encode(), padding.PKCS1v15())).decode() def raw_post(extra=None): body=f"loginname={rsa_enc(USER)}&pwd={rsa_enc(PLAIN)}" hh={"Host":HOST,"Content-Type":"application/x-www-form-urlencoded","Content-Length":str(len(body))} if extra: hh.update(extra) req="POST /api/login HTTP/1.1\r\n"+"\r\n".join(f"{k}: {v}" for k,v in hh.items())+"\r\nConnection: close\r\n\r\n"+body s=socket.create_connection((HOST,PORT),timeout=20); 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') print("\n=== SUCCESS login, NATIVE FORM (no XHR) ===") r=raw_post(); print(r.split("\r\n\r\n",1)[0][:1000]); print("BODY:", r.split("\r\n\r\n",1)[1][:300] if "\r\n\r\n" in r else "(no body)") print("\n=== SUCCESS login, AJAX (X-Requested-With) ===") r2=raw_post({"X-Requested-With":"XMLHttpRequest","Accept":"application/json"}) print(r2.split("\r\n\r\n",1)[0][:400]); print("BODY:", r2.split("\r\n\r\n",1)[1][:200] if "\r\n\r\n" in r2 else "") # cleanup sftp=ssh.open_sftp(); sftp.open('/tmp/del.sql','w').write(f"DELETE FROM sys_user WHERE username='{USER}';\n"); sftp.close() run(f"docker exec -i mysql8 mysql -uroot -p'{PWD}' bsch_userbase < /tmp/del.sql 2>&1") print("\ncleanup done") ssh.close()