likes
comments
collection
share

逆向万例|No.00002【登录篇】喜某拉某web端登录接口逆向

作者站长头像
站长
· 阅读数 19

声明:本文仅供学习交流用途,切勿用于非法行为,否则由此产生的一切后果均与作者本人无关。未经授权禁止转载本文。如有侵权,请及时通过本人公众号「逆向扬」联系删除。

0x1 开始之前

网站地址:YUhSMGNITTZMeTkzZDNjdWVHbHRZV3hoZVdFdVkyOXRMdz09(提示:两次)

本文目标:逆向该网站登录接口

前面我们聊完了如何逆向喜某拉某的登录滑块,现在我们来完成剩下的工作——逆向该网站登录接口。

0x2 密码加密分析

首先找到加密位置,依然是通过跟踪请求调用栈的方式(现在这种方法用着比较顺手,不过用这个方式找这个案例的加密位置效率有些低),定位到 v1 请求的下图方法中可以看到请求参数:

逆向万例|No.00002【登录篇】喜某拉某web端登录接口逆向

逆向万例|No.00002【登录篇】喜某拉某web端登录接口逆向

可以看到跟到图中这个位置,密码已经加密了,因此咱们继续往上跟栈,最后可以找到密码其实是在这里加密的:

逆向万例|No.00002【登录篇】喜某拉某web端登录接口逆向

那么就直接进到这个加密方法的定义中,看看其中的加密逻辑:

逆向万例|No.00002【登录篇】喜某拉某web端登录接口逆向

那么大一串写死的公钥,盲猜是 RSA 加密,结果验证下来还真是。因此这个加密方式的复现就很简单了,可以用 js 复现,可以把网站的这个加密算法扣下来,也可以用 python 复现,在这里我用 python 复现的方式。

复现的代码如下,供大家参考:

from Cryptodome.PublicKey import RSA
from Cryptodome.Cipher import PKCS1_v1_5

def encrypt_password(pwd):
    public_key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVhaR3Or7suUlwHUl2Ly36uVmboZ3+HhovogDjLgRE9CbaUokS2eqGaVFfbxAUxFThNDuXq/fBD+SdUgppmcZrIw4HMMP4AtE2qJJQH/KxPWmbXH7Lv+9CisNtPYOlvWJ/GHRqf9x3TBKjjeJ2CjuVxlPBDX63+Ecil2JR9klVawIDAQAB"
    rsa_key = RSA.import_key(base64.b64decode(public_key))  # 导入读取到的公钥
    cipher = PKCS1_v1_5.new(rsa_key)  # 生成对象
    encrypted_password = base64.b64encode(cipher.encrypt(pwd.encode(encoding="utf-8")))
    return encrypted_password

那么到这里,密码的加密就分析完了。

0x3 signature 参数生成分析

下面来分析最后一个参数:signature

通过分析代码发现 signature 参数的生成和密码加密在同一处地方。可以看到这个参数是通过 F 方法生成的,传入的是个对象,对象的属性值分别为 accountpasswordnonce

逆向万例|No.00002【登录篇】喜某拉某web端登录接口逆向

那么就来看看这个 F 方法内部的逻辑:

逆向万例|No.00002【登录篇】喜某拉某web端登录接口逆向

在这里u.xmAddress.SECURITY_KEY其实是个固定值,之后写代码时直接写死就行。getQueryStringsign 这两个方法咱们可以直接扣下来,然后用 execjs 执行就行。

在这里我放一张我扣下来的代码的截图,给大家提供一个思路,就不把所有代码扣下来的代码贴出来了,如果有困难的小伙伴可以在我的公众号发送ximoulamou获取完整的 js 代码:

逆向万例|No.00002【登录篇】喜某拉某web端登录接口逆向

到这里 signture 参数也分析完了。

最后贴上登录接口的逆向代码:

def encrypt_password(pwd):
    public_key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVhaR3Or7suUlwHUl2Ly36uVmboZ3+HhovogDjLgRE9CbaUokS2eqGaVFfbxAUxFThNDuXq/fBD+SdUgppmcZrIw4HMMP4AtE2qJJQH/KxPWmbXH7Lv+9CisNtPYOlvWJ/GHRqf9x3TBKjjeJ2CjuVxlPBDX63+Ecil2JR9klVawIDAQAB"
    rsa_key = RSA.import_key(base64.b64decode(public_key))  # 导入读取到的公钥
    cipher = PKCS1_v1_5.new(rsa_key)  # 生成对象
    encrypted_password = base64.b64encode(cipher.encrypt(pwd.encode(encoding="utf-8")))
    return encrypted_password


def get_signature(account, password, nonce):
    return js_complied.call("get_signature", account, password, nonce)


def login():
    account = "your account"
    pwd = "your password"
    encrypted_password = encrypt_password(pwd).decode()
    print(encrypted_password)
    nonce = verify_slide()
    login_payload = {
        "account": account,
        "password": encrypted_password,
        "nonce": nonce,
        "signature": get_signature(account, encrypted_password, nonce),
        "rememberMe": False
    }
    print(login_payload)
    time.sleep(1.5)
    login_r = requests.post("https://passport.ximalaya.com/web/login/pwd/v1",
                            headers=headers,
                            json=login_payload,
                            cookies=cookie)
    print(login_r.text)
    print(login_r.cookies)

0x4 验证

执行我们的脚本,模拟登录成功:

逆向万例|No.00002【登录篇】喜某拉某web端登录接口逆向

最后

本文介绍了喜某马某的登录接口逆向,总体来说还是比较简单的。但我没有直接把扣下来的 js 代码放出来,希望大家能够自己实践一下。如果大家读后有收获的话,记得点个赞哈。咱们下一篇文章再见。