某明星辰滑块分析,AES、RSA、MD5、图片拼接
js逆向
本次测试全部在本地或授权环境中进行,内容仅用于学习、技术参考与交流讨论。严禁将本文所述方法或技术用于任何非法用途。
文中提及的所有漏洞均已上报并完成修复。若读者进行类似测试,务必确保所有操作在合法、合规且获得授权的前提下进行。
如有读者因使用本文内容从事危害网络安全的行为,相关后果由其自行承担,原作者不承担任何责任。
本文为原创内容,未经授权,禁止任何形式的转载、复制或引用。如需使用,请联系作者获取授权。
逆向目标
aHR0cHM6Ly93d3cud2FidWcuY24vbG9naW4=
本次js逆向全程由AI进行分析
本文以一个实际的滑块验证码脚本为例,讲解如何利用 Python 自动获取验证码图片、解密数据、识别滑块缺口并完成验证提交。整个流程涉及 AES、RSA、Base64 编码、图像拼接以及 OCR 滑块识别。
一、整体流程概述
验证码系统一般会在前端使用复杂的加密和图片处理逻辑,保证滑块验证不被轻易绕过。本文的脚本处理流程如下:
- 向服务器请求验证码初始化接口
/verify/init
,获取包含背景图、滑块图、AES 密钥、RSA 公钥等数据。 - 利用 AES 和 RSA 解密获取背景图和滑块图。
- 将背景图碎片按服务器给定的顺序拼接成完整图片。
- 使用
ddddocr
识别滑块缺口的 X 坐标。 - 模拟前端加密逻辑,将滑块坐标进行 RSA + AES 双重加密。
- 将加密后的坐标提交到
/verify/verify
接口,完成验证。
二、关键模块解析
1. AES 取中间 16 位作为密钥
def md5_16_from_key(k: str) -> str:
return hashlib.md5(k.encode()).hexdigest()[8:24]
- 服务器返回的
k
是原始密钥。 - 先计算 MD5,再截取中间 16 个字符作为 AES-ECB 加解密的密钥。
- AES-ECB 是无向量模式,方便单块加密解密,但不推荐用于生产安全传输。
2. AES-ECB-PKCS7 解密
def aes_decrypt_ecb_pkcs7(b64_ct: str, key16: str) -> str:
cipher = AES.new(key16.encode("utf-8"), AES.MODE_ECB)
data = base64.b64decode(b64_ct)
pt = cipher.decrypt(data)
pad = pt[-1]
if 1 <= pad <= 16:
pt = pt[:-pad]
return pt.decode("utf-8", errors="ignore")
- 先 Base64 解码,再使用 AES-ECB 解密。
- 支持 PKCS7 填充去除。
- 用于解密服务器返回的
rpk
(RSA 公钥密文)、滑块信息等。
3. RSA 公钥解密(兼容 PEM/DER)
def import_rsa_public_key_any(pub_str: str) -> RSA.RsaKey:
...
- 可以自动识别 PEM 格式(带
BEGIN PUBLIC KEY
)或 Base64 编码的 DER。 - 用于解析服务器返回的加密公钥。
4. 长消息的 RSA 公钥解密
def rsa_public_decrypt_long_pkcs1_v1_5(b64_ct: str, pub_key: RSA.RsaKey) -> bytes:
...
- 由于 RSA 只能处理有限长度数据,需要分块处理。
- 每块解密后拼接得到完整明文。
- PKCS#1 v1.5 解码逻辑用于去除填充字节。
5. 图片拼接
pieces = [Image.open(BytesIO(base64.b64decode(x))) for x in resp["bg"]]
...
canvas.paste(pieces[pidx], (c * pw, r * ph))
- 服务器通常会将背景图切成若干碎片。
- 根据解密出的顺序
srs
拼接成完整图片。 - 滑块图
gd
同样解密得到 PNG bytes。
6. 滑块 OCR 识别
ocr = ddddocr.DdddOcr(det=False, ocr=False)
result = ocr.slide_match(bg_bytes, gd_png)
x_pos = result.get("target", 0)
- 使用
ddddocr
的滑块匹配功能。 - 输入完整背景图和滑块图,返回缺口 X 坐标。
- 这是自动完成滑块验证的核心步骤。
7. 模拟前端加密提交
- 前端 JS 使用
rsaPubEncrypt + aesEncrypt
对滑块坐标加密。 - Python 脚本中模拟:
- 将 X/Y 坐标用 RSA 公钥加密。
- 用 AES-ECB 进行二次加密。
- Base64 编码后形成提交数据。
encryptPositions.append([aesPosX, aesPosY])
payload = {"key": webKey, "clientPositions": encryptPositions}
requests.post(url, data=json.dumps(payload), headers=headers)
- 最终 POST 到
/verify/verify
完成验证。
三、注意点与安全性分析
- AES-ECB 模式不安全,纯粹用于滑块模拟。
- RSA 公钥加密只提供数据防篡改能力,不保证加密强度。
- 滑块 OCR容易受背景变化影响,需要实际调试。
- 服务器偶尔会对解密数据进行填充或截断,脚本做了容错处理。
- 自动识别与提交验证,本质是模拟前端行为,需合理使用,避免触碰法律和网站使用条款。
四、总结
- 本脚本完整复刻了前端滑块验证码处理流程:初始化 → AES/RSA 解密 → 图片拼接 → OCR → 加密提交。
- 使用 Python + ddddocr 实现滑块自动识别和自动验证。
- 技术亮点:
- 分块 RSA 公钥解密。
- AES-ECB 双重加密模拟前端。
- 滑块 OCR 与完整图片拼接。
- 可以作为学习前端加密流程、图像验证码识别、Python 图像处理和加密结合的案例。